ACM 一个关于深搜dfs的题目

yd2011222 2016-07-21 08:23:07
http://poj.org/problem?id=2488
这是地址 、、 是个英文题目
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

3
1 1
2 3
4 3
Sample Output

Scenario #1:
A1

Scenario #2:
impossible

Scenario #3:
A1B3C1A2B4C2A3B1C3A4B2C4

大意是:
你只能走你只能走马字形 ,,也就是一次这能走 8个地方。。但是输出的结果是 要保证 输出一定要 (1) 全部走完自己设定的 H(行)L(列)的矩形(2) 保证你的输出一定要是 这个顺序的搜索。 在可以完全走完的情况下。。
如图
...全文
173 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
mxway 2016-07-22
  • 打赏
  • 举报
回复
在DFS函数中当sum等于你的格子数时,就应该返回,不要再继续搜索了,如果不退出多层递归,有可能会继续进行深度搜索,覆盖已搜索到的正确结果。
yd2011222 2016-07-21
  • 打赏
  • 举报
回复
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int a[31][31]; int H,L,sum,z,s=1; int DFS(int i,int j,int sum) { int temp=a[i][j]; a[i][j]=sum;//赋值 if(z<sum) z=sum; if(i-1>=1&&j-2>=1&&a[i-1][j-2]==0) {DFS(i-1,j-2,sum+1);a[i-1][j-2]=0; } if(i+1<=H&&j-2>=1&&a[i+1][j-2]==0) {DFS(i+1,j-2,sum+1);a[i+1][j-2]=0; } if(i-2>=1&&j-1>=1&&a[i-2][j-1]==0) { DFS(i-2,j-1,sum+1);a[i-2][j-1]=0; } if(i+2<=H&&j-1>=1&&a[i+2][j-1]==0) {DFS(i+2,j-1,sum+1);a[i+2][j-1]=0; } if(i-2>=1&&j+1<=L&&a[i-2][j+1]==0) { DFS(i-2,j+1,sum+1);a[i-2][j+1]=0; } if(i+2<=H&j+1<=L&&a[i+2][j+1]==0) {DFS(i+2,j+1,sum+1);a[i+2][j+1]=0; } if(i-1>=1&&j+2<=L&&a[i-1][j+2]==0) { DFS(i-1,j+2,sum+1); a[i-1][j+2]=0;} if(i+1<=H&&j+2<=L&&a[i+1][j+2]==0) { DFS(i+1,j+2,sum+1); a[i+1][j+2]=0; } return 0; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&H,&L); memset(a,0,sizeof(a)); sum=1,z=1; DFS(1,1,1); int x,y; for(x=1;x<=H;x++) { for(y=1;y<=L;y++) printf("%d ",a[x][y]); putchar('\n'); } printf("Scenario #%d:\n",s) ; if(z!=H*L) { s++; printf("impossible\n"); continue; } for(int t=1;t<=z;t++) { for(int i=1;i<=H;i++) { for(int j=1;j<=L;j++) { if(a[i][j]==t) { if(j==1) printf("A"); else if(j==2) printf("B"); else if(j==3) printf("C"); else if(j==4) printf("D"); else if(j==5) printf("E"); else if(j==6) printf("F"); else if(j==7) printf("G"); else if(j==8) printf("H"); printf("%d",i); } } } } s++; printf("\n"); } return 0; }

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧