题目:

骑士厌倦了一次又一次地看到相同的黑白方块,并决定
环游世界。每当骑士移动时,它都是一个方向上的两个正方形和一个垂直于此方向的正方形。骑士的世界就是他所生活的棋盘。我们的骑士住在一个棋盘上,这个棋盘的面积比普通的8 * 8棋盘小,但它仍然是矩形的。你能帮助这个冒险的骑士制定旅行计划吗?问题 找到一条道路,使骑士访问每个方块一次。

输入:

输入以第一行中的正整数 n 开头。以下行包含 n 个测试用例。每个测试用例由一行具有两个正整数 p 和 q 组成,使得 1 <= p * q <= 26。这表示一个 p * q 棋盘,其中 p 描述有多少个不同的平方数 1, . . . , p 存在, q 描述存在多少个不同的方形字母。这些是拉丁字母表的前q个字母:A,...

输出:

每个方案的输出都以包含"方案#i:"的行开头,其中 i 是从 1 开始的方案编号。然后打印一行,其中包含字典学上的第一条路径,该路径访问棋盘的所有方块,骑士移动,然后是空行。路径应通过连接所访问的正方形的名称在一条线上给出。每个正方形名称由一个大写字母后跟一个数字组成。
如果不存在这样的路径,则应在一行上输出不可能。

示例输入

3
1 1
2 3
4 3

示例输出

Scenario #1:
A1Scenario #2:
impossibleScenario #3:
A1B3C1A2B4C2A3B1C3A4B2C4.

设计思路:

要遍历所有走的格子数,就要利用到深度优先搜索,首先我们定义骑士8个可走的位置,用flag来标志骑士能否走完所有格子。首先定义dfs函数,先判断m*n是否走完所有格子,若走完flag则置为1,若没走完,则进行深搜,看下一个位置能否走。main函数里面的memset表示将数组置为0,特别对于字符型数组,不清空,输出的时候,很可能是乱码。

代码如下:

#include<iostream>
#include<string.h>
using namespace std;
int a[30][30];
int step[8][2] = { {1,2},{1,-2},{2,1} ,{2,-1},{-1,2},{-1,-2},{-2,-1},{-2,1} };//骑士可以走的八个位置坐标
int m, n, book[100][2];//遍历骑士所走的位置
bool flag = 0;//判断是否完成
void dfs(int x, int y, int t) { //t为格子数目if (t == (n * m)) {   //判断所有的格子是否被遍历完全flag = 1;return;}if (flag == 1)return;for (int i = 0; i < 8; i++) {int tx = x + step[i][0], ty = y + step[i][1]; //当前位置if (a[tx][ty] == 1) //如果走过了就遍历为1{a[tx][ty] = 0; //走过了不能再走了,遍历为0book[t][0] = tx;book[t][1] = ty;dfs(tx, ty, t + 1);  //进行深搜if (flag == 1) //如果找到路径了,则跳出循环break;a[tx][ty] = 1; //若道理不通就进行回溯}}return;
}
int main()
{int x;cin >> x;for (int i = 1; i <= x; i++) {flag = 0;  //记录是否找到路径memset(a, 0, sizeof(a));  //将数组初始化为0memset(book, 0, sizeof(book));cin >> m >> n;for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++)a[i][j] = 1; //6将所走的地方标记为1a[1][1] = 0;dfs(1, 1, 1);book[0][0] = 1;book[0][1] = 1;cout << "scenario #" << i << ":" << endl;if (flag == 1){for (int i = 0; book[i][1] != 0; i++){cout << (char)(book[i][1] - 1 + 'A') << book[i][0];}cout << endl;}elsecout << "impossible" << endl;cout << endl;}
}

运行结果:

poj—2488骑士的旅程(深搜)相关推荐

  1. Poj(2488),按照字典序深搜

    题目链接:http://poj.org/problem?id=2488 思路:按照一定的字典序深搜,当时我的想法是把所有的可行的路径都找出来,然后字典序排序. 后来,凡哥说可以在搜索路径的时候就按照字 ...

  2. 简单深搜(poj 3009)

    题目链接:http://poj.org/problem?id=3009 题目:冰壶撞向目的地,只有遇到"1"才能停下来,并且把"1"撞成"0" ...

  3. POJ 1562深搜判断连体油田个数

    http://poj.org/problem?id=1562 大意:输入mp二维矩阵,规定'@'连体的包括对角线为一片油田,统计共有多少油田.深搜方向数组dir设置8个方向遇到@继续搜索把当前位置赋值 ...

  4. 【深搜】骑士游历(二)

    骑士游历(二) 问题描述:设有一个n×n的棋盘(n≤10),在棋盘上的任意一点A(x,y)有一中国象棋<马>,<马>走的规则同前,但取消<马>只能向右走的条件.试找 ...

  5. 【深搜】骑士游历(ssl 1277)

    骑士游历 Description 如下图所示有m*n(n,m<=15)一个棋盘,在棋盘左下角的A(1,1)点,有一个中国象棋〈马〉,并约定马走的规则: ①走日字:②只能向右走. Sample I ...

  6. poj 1950 Dessert 深搜

    题意: 给n,问有多少和由1,2...n,和'+','-','.'(表示连接,4.5表示45)组成,值为0的表达式. 分析: 深搜,因为要枚举到"连接"的情况,所以传送pre表示上 ...

  7. 骑士精神(双向深搜+meet in the middle)

    题目描述 在一个5×55×55×5的棋盘上有121212个白色的骑士和121212个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为111,纵坐标相差为22 ...

  8. POJ 3414 Pots(深搜并打印路径)

    POJ 3414 Pots(深搜并打印路径) You are given two pots, having the volume of A and B liters respectively. The ...

  9. I - 滑雪 POJ - 1088(深搜,记忆化搜索)

    Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡. ...

最新文章

  1. oracle11g怎么显示中文,ORACLE11G中PLSQL中文显示乱码、Linux下sqlplus查询中文乱码
  2. 高德地图SDK大致使用
  3. ES6之路第十二篇:Promise对象
  4. html实现ppt缩放效果,Powerpoint 2016缩放功能详解(附案例)
  5. ITK:手动遍历具有成形邻域的图像区域
  6. [Java基础]获取Class类的对象
  7. Maven和Java多版本模块
  8. “找不到网络路径”的检测方法及解决方案
  9. unity3d 中加入�视频
  10. can硬件结构和工作原理_汽车CAN总线工作原理及测量方法详解
  11. android多线程计时器,Android 计时器Timer用法
  12. 使用Ionic3创建原生app系统入门
  13. linux内核容器的打包,简年6:一个关于 Linux 容器化的脑洞
  14. SEO优化核心盘点,解谜、扫雷、权重提升统统在这
  15. 西门子1500PLC机器人焊接程序(西门子PLC+西门子触摸屏)
  16. 「Vue实战」武装你的前端项目
  17. Object.assign与vue $set
  18. Blender插件天空地形山水自然环境生成器 TerrainScapes V2.0
  19. http2协议翻译(转)
  20. PythonQt——yolov5手势识别隔空操纵车载音乐播放器

热门文章

  1. 什么是ERP系统?新精铺ERP优势是什么
  2. 视频教程-毕业设计精品课之化妆品购物网站 化妆品商城源码实战讲解-.NET
  3. 关于使用mac开发的一些小技巧
  4. Linux 内核配置选项(转)
  5. 金融大亨的十二条人生信条
  6. Vivado设计秒表计时器实现00分00.00秒到59分59.99秒的计时(verilog语言)
  7. 故事向|在3A游戏公司工作多年的3D建模师自述,制作3A大作经验心得(下)
  8. Potplayer安装 之 视频编解码器
  9. 男孩姓洪取什么名字好听
  10. Android基础入门教程——8.3.1 三个绘图工具类详解