POJ2488-A Knight's Journey(DFS)
来源:互联网 发布:淘宝对话生成 编辑:程序博客网 时间:2024/05/19 23:14
POJ2488 原题链接:http://poj.org/problem?id=2488
A Knight's Journey
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 46885 Accepted: 15967
Description
Background
The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey
around the world. Whenever a knight moves, it is two squares in one direction and one square perpendicular to this. The world of a knight is the chessboard he is living on. Our knight lives on a chessboard that has a smaller area than a regular 8 * 8 board, but it is still rectangular. Can you help this adventurous knight to make travel plans?
Problem
Find a path such that the knight visits every square once. The knight can start and end on any square of the board.
The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey
around the world. Whenever a knight moves, it is two squares in one direction and one square perpendicular to this. The world of a knight is the chessboard he is living on. Our knight lives on a chessboard that has a smaller area than a regular 8 * 8 board, but it is still rectangular. Can you help this adventurous knight to make travel plans?
Problem
Find a path such that the knight visits every square once. The knight can start and end on any square of the board.
Input
The input begins with a positive integer n in the first line. The following lines contain n test cases. Each test case consists of a single line with two positive integers p and q, such that 1 <= p * q <= 26. This represents a p * q chessboard, where p describes how many different square numbers 1, . . . , p exist, q describes how many different square letters exist. These are the first q letters of the Latin alphabet: A, . . .
Output
The output for every scenario begins with a line containing "Scenario #i:", where i is the number of the scenario starting at 1. Then print a single line containing the lexicographically first path that visits all squares of the chessboard with knight moves followed by an empty line. The path should be given on a single line by concatenating the names of the visited squares. Each square name consists of a capital letter followed by a number.
If no such path exist, you should output impossible on a single line.
If no such path exist, you should output impossible on a single line.
Sample Input
31 12 34 3
Sample Output
Scenario #1:A1Scenario #2:impossibleScenario #3:A1B3C1A2B4C2A3B1C3A4B2C4
题目大意:给一个p*q的国际象棋棋盘,棋盘上有马从任意起点开始,按照马的跳法跳完整个棋盘,如果能则输出最小字典序的路径,如果不能则输出impossible。
思路:
1.看到这道题很容易想到dfs,这道题是判断是否能够一遍走完,如何判断是否走完呢?可以添加一个步数数据与一个标记,若无路可走时步数恰好等于格子数,则说明可以一次走完,标记为true,若走到最后无路可走时步数不等于格子数,那么说明这种走法不能一次走完,标记为false。
2.如果不重复走一遍就走完了,标记为true,算法停止,假若在某种dfs下走到某一步时无路可走而棋盘还有未走到的点(步数小于格子数),那么退回这一步,尝试其他的路线,退回这一步就是在递归深搜返回时重置该点,以便在当前路线走一遍行不通换另一种路线时,该点的状态是未访问过的,而不是像普通的dfs当作已经访问了。
3.题目要求输出的路径为字典序最小的路径,所以我们在跳马的时候的优先顺序应以字典序最小的顺序,且从A1点开始走。
代码如下:
#include<cstdio>#include<cstdlib>#include<iostream>#include<cstring>using namespace std;const int MAX_N = 27;int p,q;struct Step{ char x,y;}path[MAX_N];bool zouwan;//标记是否已经跳完bool vis[MAX_N][MAX_N];const int dx[8] = {-1, 1, -2, 2, -2, 2, -1, 1};const int dy[8] = {-2, -2, -1, -1, 1, 1, 2, 2};void DFS(int x,int y,int step){ int vx,vy; path[step].x=x+'0';//int 转为 char path[step].y=y+'A'-1; if(step==p*q)//步数等于格子数说明可以一次跳完 { zouwan=true;//标记为可以跳完 return; } for(int i=0;i<8;i++) { vx=x+dx[i]; vy=y+dy[i]; if (0<vx&&vx<=p&&0<vy&&vy<=q&&!vis[vx][vy]&&!zouwan) { vis[vx][vy] = true; DFS(vx,vy,step+1); vis[vx][vy] = false;//退回该步 } }}int main(){ int T; scanf("%d",&T); for(int c=1;c<=T;c++) { zouwan=false; scanf("%d %d",&p,&q); int num=0;//步数标记 memset(vis,false,sizeof(vis)); vis[1][1]=true; DFS(1,1,1); printf("Scenario #%d:\n", c); if(zouwan)//可以跳完输出路径 { for(int i=1;i<=p*q;i++) { printf("%c%c",path[i].y,path[i].x); } printf("\n"); } else printf("impossible\n");//不能跳完输出impossible if (c != T) printf("\n"); }}
阅读全文
0 0
- POJ2488 A Knight's Journey(DFS)
- POJ2488 A Knight's Journey(DFS)
- POJ2488-A Knight's Journey(DFS)
- POJ2488:A Knight's Journey(DFS)
- POJ2488 A Knight's Journey(DFS)
- POJ2488 A Knight's Journey DFS
- DFS poj2488 A Knight's Journey
- POJ2488 A Knight's Journey(dfs)
- POJ2488 A Knight's Journey(DFS)
- POJ2488 A Knight's Journey[dfs]
- poj2488(DFS)之A Knight's Journey
- POJ2488 A Knight's Journey (DFS)
- poj2488-A Knight's Journey【DFS】
- poj2488 A Knight's Journey(简单dfs)
- poj2488——A Knight's Journey(dfs)
- Knight's Journey(poj2488,dfs)
- A Knight's Journey(poj2488)
- poj2488 A Knight's Journey
- HTTPS请求过程
- Hadoop 大量小文件问题及解决方案
- 研读java编程思想--Thinking In Java笔记(一)
- WebStorm的快捷键-不完整
- Laravel 下 Angularjs 的安装
- POJ2488-A Knight's Journey(DFS)
- android不规则图形控件显示背景图片以及点击效果,多边形控件实例
- JavaScript正则表达式总结
- 操作系统面试题
- 奇怪的String.getBytes("Unicode")
- python下的web开发框架-Django,django模板的使用
- MySQL各引擎之间的区别
- Implementation of Hierarchical Attention Networks for Document Classification的讲解与Tensorflow实现
- 1.3 eclips下载与安装