POJ2488,A Knight's Journey,DFS脑子快抽筋了这几天我会乱说?
来源:互联网 发布:js提示框自动消失 编辑:程序博客网 时间:2024/05/17 03:42
A Knight's Journey
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
分析:
从左上角开始走遍棋盘,国际象棋跟中国象棋跳马一样...
注意遍历失败时的回溯...以及字典序给出顺序,那么方向数组就应该是dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1}...而不是单纯的顺时针逆时针。
这里要说一下图相关的题,十几年的数学知识告诉我们坐标按(x,y)顺序给出。但在程序设计中一般都是行优先,也就是[i][j],很容易搞反...
要倍加小心。
code:
#include<iostream>#include<cstdio>#include<cstring>#include<string>#define MAX 26using namespace std;int p,q;int vis[MAX][MAX],path[MAX+5][2];int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};bool ok;//用于记录是否遍历成功void dfs(int x,int y,int step){ path[step+1][0]=x; path[step+1][1]=y; if(step==p*q-1) { for(int i=1;i<=p*q;i++) printf("%c%d",path[i][0]+'A'-1,path[i][1]); printf("\n"); ok=true; return ; } else for(int i=0;i<8;i++) { int nx=x+dir[i][0],ny=y+dir[i][1]; if(nx>0&&ny>0&&nx<=q&&ny<=p&&!vis[nx][ny]) { vis[nx][ny]=1; dfs(nx,ny,step+1); if(!ok) vis[nx][ny]=0;//不成功的话回溯要将访问状态改成未访问 } }}int main(){ int n,step,count=0; scanf("%d",&n); while(n--) { step=0; ok=false; count++; memset(vis,0,sizeof(vis)); scanf("%d %d",&p,&q); vis[1][1]=1; printf("Scenario #%d:\n",count); dfs(1,1,0); if(!ok) printf("impossible\n"); printf("\n"); } return 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
- 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 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)
- poj2488 A Knight's Journey
- poj2488 - A Knight's Journey
- poj2488 A Knight's Journey
- 方法的直接调用,反射调用与……Lambda表达式调用
- 【连载】Unity3D ——强大的跨平台3D游戏开发工具(五)
- 显示Bitmap并让适应屏幕改变大小显示
- 两表同步
- 演化理解 Android 异步加载图片
- POJ2488,A Knight's Journey,DFS脑子快抽筋了这几天我会乱说?
- 学习SVN(一)
- VC++分析数据包实现分析http协议
- android 自定义view
- 视频码率,帧率和分辨率的联系与区别
- 进程,线程,及之间的通信
- 网址收集
- 线程创建的几个函数
- 【连载】Unity3D ——强大的跨平台3D游戏开发工具(六)