poj 2488 A Knight's Journey
2014-04-08 13:18
274 查看
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.
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.
Sample Input
Sample Output
解题思路:深搜+回溯,并记录路径;
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 28335 | Accepted: 9675 |
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.
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.
Sample Input
3 1 1 2 3 4 3
Sample Output
Scenario #1: A1 Scenario #2: impossible Scenario #3: A1B3C1A2B4C2A3B1C3A4B2C4
解题思路:深搜+回溯,并记录路径;
#include<stdio.h> #include<string.h> #define N 30 int dx[8]={-2,-2,-1,-1,1,1,2,2}; int dy[8]={-1,1,-2,2,-2,2,-1,1}; int mark ,n,m,ff; char ans[2*N],cur[N*2]; struct node { int x,y; //x记录横坐标,y记录纵坐标 }f ; int judge(int x,int y) { if(x>0&&x<=n&&y>0&&y<=m) return 1; return 0; } void dfs(int x,int y,int num) { int i,k,di,dj; if(num==n*m) //找到答案后要立即记录路径 { for(k=0;k<n*m;k++) //不能用i,换一个变量控制循环 { cur[2*k]=(char)f[k].x-1+'A'; //把横纵坐标转换为字符型字母和数字 cur[2*k+1]=(char)f[k].y+'0'; } cur[2*k]='\0'; if(ff) { if(strcmp(cur,ans)<0) //取字典序最小的序列 strcpy(ans,cur); } else { ff=1; strcpy(ans,cur); } return ; } for(i=0;i<8;i++) { di=x+dx[i]; dj=y+dy[i]; if(judge(di,dj)&&!mark[di][dj]) { mark[di][dj]=1; f[num].x=di; f[num].y=dj; dfs(di,dj,num+1); mark[di][dj]=0; //回溯 } } return ; } int main() { int i,j,k,T,cnt=1; scanf("%d",&T); while(T--) { scanf("%d%d",&m,&n); for(i=1;i<=n;i++) //字母在前 { for(j=1;j<=m;j++) //数字在后 { memset(mark,0,sizeof(mark)); mark[i][j]=1; f[0].x=i; f[0].y=j; ff=0; dfs(i,j,1); if(ff) //搜到的第一个答案保证是字典序最小的 break; } if(ff) break; } printf("Scenario #%d:\n",cnt++); if(!ff) printf("impossible\n\n"); else printf("%s\n\n",ans); } return 0; }
相关文章推荐
- POJ_2488_A Knight's Journey
- DFS poj2488 A Knight's Journey
- POJ 2488 深搜
- poj 2488 骑士的旅行
- poj2488 回溯 注意字典 边缘的处理思想
- POJ 2488 A Knight's Journey【DFS】
- poj 2488 dfs
- poj 2488 A Knight's Journey 【骑士周游 dfs + 记忆路径】
- POJ2488,A Knight's Journey,DFS脑子快抽筋了这几天我会乱说?
- [ACM训练] 算法初级 之 搜索算法 之 深度优先算法DFS (POJ 2251+2488+3083+3009+1321)
- poj 2488 A Knight's Journey(dfs+字典序路径输出)
- POJ 2488 A Knight's Journey
- http://poj.org/problem?id=2488
- poj 2488 A Knight's Journey
- poj—2488骑士的旅程
- POJ-2488 A Knight's Journey 解题报告(搜索) 马跳遍棋格的字典序问题
- POJ_2488: A Knight's Journey
- POJ 2488 A Knight's Journey
- poj2488-搜索
- POJ——2488(深搜)