POJ 2488 A Knight's Journey(dfs)
2015-08-28 09:14
393 查看
Description
给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径
Input
多组用例,第一行为用例组数,每组用例占一行,包括两个整数p,q表示棋盘行列数
Output
对于每组用例,如果马能够不重复的走完所有格则按字典序记录其路径,否则输出impossible,每组输出后跟一空行
Sample Input
3
1 1
2 3
4 3
Sample Output
Scenario #1:
A1
Scenario #2:
impossible
Scenario #3:
A1B3C1A2B4C2A3B1C3A4B2C4
Solution
简单跳马搜索,注意几点
1,题目要求以字典序输出路径,那么搜索的方向就要以特殊的顺序排列了。这样只要每次从dfs(A,1)开始搜索,第一个成功遍历的路径一定是以字典序排列。下图是搜索的次序,马的位置为当前位置,序号格为测试下一步的位置的测试先后顺序,按这个顺序测试,那么第一次成功周游的顺序就是字典序
2,行数为p,列数为q,行用数字表示,列用字母表示
Code
给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径
Input
多组用例,第一行为用例组数,每组用例占一行,包括两个整数p,q表示棋盘行列数
Output
对于每组用例,如果马能够不重复的走完所有格则按字典序记录其路径,否则输出impossible,每组输出后跟一空行
Sample Input
3
1 1
2 3
4 3
Sample Output
Scenario #1:
A1
Scenario #2:
impossible
Scenario #3:
A1B3C1A2B4C2A3B1C3A4B2C4
Solution
简单跳马搜索,注意几点
1,题目要求以字典序输出路径,那么搜索的方向就要以特殊的顺序排列了。这样只要每次从dfs(A,1)开始搜索,第一个成功遍历的路径一定是以字典序排列。下图是搜索的次序,马的位置为当前位置,序号格为测试下一步的位置的测试先后顺序,按这个顺序测试,那么第一次成功周游的顺序就是字典序
2,行数为p,列数为q,行用数字表示,列用字母表示
Code
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define maxn 30 int d[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};//注意搜索方向的顺序 bool vis[maxn][maxn];//标记数组 int path[maxn*maxn][2];//记录路径 int T,p,q; int flag;//标志变量记录是否有解 int res=1; void dfs(int x,int y,int step) { if(step==p*q)//不重复走完所有格 { flag=1; cout<<"Scenario #"<<res++<<":"<<endl;//按格式输出 for(int i=0;i<p*q;i++) printf("%c%d",path[i][1]+'A',path[i][0]+1); cout<<endl<<endl;//按格式输出 return ; } for(int i=0;i<8;i++)//八个方向遍历 { int xx=x+d[i][0]; int yy=y+d[i][1]; if(!vis[xx][yy]&&xx>=0&&xx<p&&yy>=0&&yy<q)//可以跳 { vis[xx][yy]=true;//标记 path[step][0]=xx; path[step][1]=yy; dfs(xx,yy,step+1);//继续搜索 vis[xx][yy]=false;//回溯 if(flag)//找到可行解 return ; } } } int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&p,&q); memset(vis,false,sizeof(vis)); flag=0; path[0][0]=0; path[0][1]=0; vis[0][0]=true;//从(A,1)开始搜索 dfs(0,0,1); if(!flag)//不能走完所有格 { cout<<"Scenario #"<<res++<<":"<<endl;//按格式输出 cout<<"impossible"<<endl<<endl;//按格式输出 } } return 0; }
相关文章推荐
- 创新驱动发展看天津:再识小巨人
- C# 程序获取管理员权限运行
- 调用门的定义+调用
- 调用门的定义+调用
- WebRTC相关技术预研总结
- 清除缓存
- OpenCV坐标体系介绍以及像素点at操作讲解
- 20Lync2013升级到SkypeForBusiness2015进阶篇--SFB后端Mirror高可用切换测试
- POJ 2485 Highways(最小生成树-Prim)
- 未来安卓智能音响必将和互联网音乐版权公司绑定
- 2015应该学习的前端语言与框架
- iOS AutoLayout自动布局中级开发教程(4)-label文字自动适应大小,宽度(新)
- HDOJ 1248 寒冰王座(完全背包)
- java服务器端获取客户端IP地址
- 实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求
- Win10 Mobile 10530预览版来啦 下周发布
- Solaris 10 x86系统上添加新硬盘
- 你给我解析清楚,都有了CALayer了,为什么还要UIView
- java类的加载以及初始化顺序
- POJ 2470 Ambiguous permutations(水~)