题目链接:http://vjudge.net/contest/view.action?cid=51369#problem/A   (A - Children of the Candy Corn)

http://poj.org/problem?id=2488   (A Knight's Journey)

 (不知道为什么,名字竟然不同哇~~~~还是poj 改名改得好)

题目意思:给出一个p * q 的棋盘,行用阿拉伯数字1,2,...,p-1, p 来表示,列从大写字母'A'开始表示。我这里为了简化问题,对于以下5 * 5 这个棋盘,可以把(1, B) 这个点看成是坐标(1, 2),其他依此类推。不硬性规定要从哪个点开始,从哪个点结束,不过要把整个棋盘的每个点都要走过,按“日”字来走(玩过中国象棋的人一定很熟悉,就是马走“日”),如果不能把每个点都走过,就输出impossible,否则输出一条字典序最少的路径。

这个字典序最少真的是害人不少啊~~~而且,DFS 保存路径,我还是第一次接触,可能方法比较笨。为了按字典序最少来输出,很明显对于(3, 3)这个点来说,最先试探的应该是(2, 1) 这个点,其次是(4, 1), 接着是(1, 2), (5, 2),(1, 4), (5, 4), (2, 5), (4, 5)。

红色字体的那部分表示相对于(3, 3) 这个中点来看,能走的8个点相对这个中点来说相差多少,假设要去(4, 1)这个点,(3,3) + (1, -2) ——> (4,1),所以设的8个方向可以到达的点不能乱来,是有顺序的!!!!

虽然写得比较长,不过是自己花了差不多4个小时做出来的(参考了自己以前写得一篇Knight Moves),也算是挺有成就感的^_^

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std; const int maxn = + ;
int dx[] = {-, , -, , -, , -, }; // 这个设置不要乱了,字典序输出最少的关键啊~~~
int dy[] = {-, -, -, -, , , , };
int grid[maxn][maxn], route[maxn];
int p, q, flag, len; void dfs(int x, int y, int move, int len)
{
if (move == p*q) // 找到一条路径就不再找了(flag = 1, 使得dfs到此结束)
{
flag = ;
for (int i = ; i < len-; i++)
{
if (route[i])
{
if (i % == )
printf("%c", route[i]+'A'-); // route[0], route[2],...,route[2*n] 保存字母
else
printf("%d", route[i]); // route[1], route[3], ...,route[2*n-1] 保存数字
}
}
printf("%c%d\n", route[len-]+'A'-, route[len-]);
}
for (int i = ; i < && !flag; i++)
{
int tx = x + dx[i];
int ty = y + dy[i];
if (tx > && tx <= p && ty > && ty <= q && !grid[tx][ty]) // 在棋盘里面且没有走过
{
grid[tx][ty] = ;
route[len] = ty; // 不是tx!!看样例!! 所以保存路径时要稍稍注意啦^_^
route[len+] = tx;
dfs(tx, ty, move+, len+);
grid[tx][ty] = ;
route[len] = ;
route[len+] = ;
}
}
} int main()
{
int t;
while (scanf("%d", &t) != EOF)
{
int cas = ;
while (t--)
{
scanf("%d%d", &p, &q);
printf("Scenario #%d:\n", ++cas);
flag = ;
for (int i = ; i <= p && !flag; i++)
{
for (int j = ; j <= q && !flag; j++)
{
memset(grid, , sizeof(grid));
memset(route, , sizeof(route));
flag = ;
len = ;
route[len] = i; // 假设可以从i, j,出发
route[len+] = j;
grid[i][j] = ; // i, j设为已走
dfs(i, j, , );
}
}
if (!flag)
printf("impossible\n");
printf("\n");
}
}
return ;
}

(今天暑假集训生活正式开始了,努力吧,+2)

广大暑假训练1(poj 2488) A Knight's Journey 解题报告的更多相关文章

  1. POJ 2488 -- A Knight's Journey(骑士游历)

    POJ 2488 -- A Knight's Journey(骑士游历) 题意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. 经典的“骑士游历”问题 ...

  2. POJ 2488 A Knight's Journey(DFS)

    A Knight's Journey Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 34633Accepted: 11815 De ...

  3. POJ 2488 A Knight's Journey(深搜+回溯)

    A Knight's Journey Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) ...

  4. poj 2488 A Knight's Journey( dfs )

    题目:http://poj.org/problem?id=2488 题意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. #include <io ...

  5. POJ 2488 A Knight's Journey (回溯法 | DFS)

    题目链接:http://poj.org/problem?id=2488 题意: 在国际象棋的题盘上有一个骑士,骑士只能走“日”,即站在某一个位置,它可以往周围八个满足条件的格子上跳跃,现在给你一个p ...

  6. poj 2488 A Knight's Journey 【骑士周游 dfs + 记忆路径】

    题目地址:http://poj.org/problem?id=2488 Sample Input 3 1 1 2 3 4 3 Sample Output Scenario #1: A1 Scenari ...

  7. POJ 2488 A Knight's Journey【DFS】

    补个很久之前的题解.... 题目链接: http://poj.org/problem?id=2488 题意: 马走"日"字,让你为他设计一条道路,走遍所有格,并输出字典序最小的一条 ...

  8. Poj 2488 A Knight's Journey(搜索)

    Background The knight is getting bored of seeing the same black and white squares again and again an ...

  9. [poj]2488 A Knight's Journey dfs+路径打印

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 45941   Accepted: 15637 Description Bac ...

随机推荐

  1. Codevs 1043 ==洛谷 P1004 方格取数

    题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 ...

  2. 球形空间产生器 BZOJ 1013

    球形空间产生器 [问题描述] 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便 ...

  3. koa2 从入门到进阶之路 (一)

    首先我们先来了解一下 Koa 是什么,https://koa.bootcss.com/,这是 Koa 的官方网站,映入眼帘的第一句就是 Koa -- 基于 Node.js 平台的下一代 web 开发框 ...

  4. Java普通员工管理系统

    login GUI界面(登录) package 普通员工管理系统; import java.awt.event.ActionEvent; import java.awt.event.ActionLis ...

  5. ASP.NETCore使用AutoFac依赖注入

    原文:ASP.NETCore使用AutoFac依赖注入 实现代码 1.新建接口类:IRepository.cs,规范各个操作类的都有那些方法,方便管理. using System; using Sys ...

  6. BUPT 2012复试机考 4T

    题目描述 我们都学习过计算机网络,知道网络层IP协议数据包的头部格式如下: 其中IHL表示IP头的长度,单位是4字节:总长表示整个数据包的长度,单位是1字节.传输层的TCP协议数据段的头部格式如下:  ...

  7. 阿里云OSS 图片处理api(custom)

    阿里云OSS 图片处理api(custom) 阿里云对象存储服务(Object Storage Service, 简称OSS) 学习了:https://blog.csdn.net/u014559227 ...

  8. 跟阿根一起学Java Web开发一:开发环境搭建及JSPGen基础配置

    JSPGenSDF软件开发框架(于2014年5月5号公布4.0版).简称JSPGen,专用Java Web方面平台式软件开发,整个框架也能够说是前台与后台的一个粘合剂,如今对JSPGenSDF进行开发 ...

  9. Elasticsearch 之 慘痛部署(分片移位)

    部署说明 硬件 server两台: 机器A:64G内存 机器B:32G内存 分片 共12个节点 2个查询节点.10个存储节点 8个主分片 1个复制分片(每一个分片都有一个副本分布在不同的节点上面) 每 ...

  10. Using Virtual Serial Ports on Linux (Ubuntu)

    http://www.xappsoftware.com/wordpress/2013/10/07/using-virtual-serial-ports-on-linux-ubuntu/?goback= ...