POJ2488 骑士游历 A Knight's Journey 解题报告
来源:互联网 发布:彩虹六号960m优化设置 编辑:程序博客网 时间:2024/04/27 00:06
这个题有3点要注意的地方。
1、弄清题意,p指行号,从上到下依次是1,2,3...p;q指列号,从左到右依次是A,B,C,D...,字典序输出意思是先按列排序,左边的在前,同一列的按行排序,行号小的在前。
2、递归遇到某个方块的下一步无处可跳时,返回上层之前要把vis矩阵相应位置清零!还有起始位置就是A1,如果A1无解则不需要再遍历别的情况了,直接输出impossible即可。
3、输出的时候记得在每种情况后都有一行空格。。。。。。
代码如下:
#include<iostream>#include<stack>using namespace std;int vis[8][8];struct loc{int x,y;loc(int a,int b){x=a;y=b;}};stack<loc> que;void clear_que(){while(que.size()!=0){que.pop();}}bool is_full(int map[8][8],int p,int q){for (int i=0;i<p;i++){for (int j=0;j<q;j++){if (map[i][j]==0){return 0;}}}return 1;}/********************************///x:the row number in vis[][];//y:the column number in vis[][];/*********************************//*bool dfs(int x,int y,int p,int q){if (x<0 || y<0 || x>=p || y>=q) return 0;//out of the rangeelse if (vis[x][y]==1)return 0;else {vis[x][y]=1;loc location(x,y);que.push(location);//将路径压入堆栈if (is_full(vis,p,q)) return 1; if (dfs(x-1,y-2,p,q)) return 1;if (dfs(x+1,y-2,p,q)) return 1;if (dfs(x-2,y-1,p,q)) return 1;if (dfs(x+2,y-1,p,q)) return 1;if (dfs(x-2,y+1,p,q)) return 1;if (dfs(x+2,y+1,p,q)) return 1;if (dfs(x-1,y+2,p,q)) return 1;if (dfs(x+1,y+2,p,q)) return 1;que.pop();//到此说明无路可走,所以该点不能加入路径,出栈vis[x][y]=0;//清除记录,勿忘!return 0;}}int main(){int cases;cin>>cases;int count=0;while(cases--){count++;clear_que();memset(vis,0,sizeof(vis));int p,q;cin>>p>>q;cout<<"Scenario #"<<count<<":"<<endl;if (dfs(0,0,p,q)) {stack<loc> out;while(!que.empty()){//因为是逆序的,所以要另一个堆栈out.push(que.top());que.pop();}while(!out.empty()){cout<<(char)('A'+out.top().y)<<out.top().x+1;out.pop();}cout<<endl;}else {cout<<"impossible"<<endl;}}return 0;}提交后说超时了,反正情况也不多,只好打表了,一共12种情况下有同路,其余均为impossible。
if(p==1 &&q ==1)cout<<"A1"<<endl;else if(p==3 && q==4)cout<<"A1C2A3B1D2B3C1A2C3D1B2D3"<<endl;else if(p==3 && q==7)cout<<"A1B3D2F1G3E2G1F3E1G2E3C2A3B1C3A2C1D3B2D1F2"<<endl;else if(p==3 && q==8)cout<<"A1B3C1A2C3D1B2D3E1G2E3C2A3B1D2F1H2F3G1E2G3H1F2H3"<<endl;else if(p==4 && q==3)cout<<"A1B3C1A2B4C2A3B1C3A4B2C4"<<endl;else if(p==4 && q==5)cout<<"A1B3C1A2B4D3E1C2D4E2C3A4B2D1E3C4A3B1D2E4"<<endl;else if(p==4 && q==6)cout<<"A1B3C1A2B4C2D4E2F4D3E1F3D2B1A3C4B2A4C3E4F2D1E3F1"<<endl;else if(p==5 && q==4)cout<<"A1B3A5C4D2B1A3B5D4C2B4A2C1D3C5A4B2D1C3D5"<<endl;else if(p==5 && q==5)cout<<"A1B3A5C4A3B1D2E4C5A4B2D1C3B5D4E2C1A2B4D5E3C2E1D3E5"<<endl;else if(p==6 && q==4)cout<<"A1B3A5C6D4B5D6C4D2B1A3C2B4A2C1D3B2D1C3D5B6A4C5A6"<<endl;else if(p==7 && q==3)cout<<"A1B3C1A2C3B1A3C2B4A6C7B5A7C6A5B7C5A4B2C4B6"<<endl;else if(p==7 && q==4)cout<<"A1B3A5B7D6B5A7C6D4C2A3B1D2C4B2A4B6D7C5A6C7D5B4D3C1A2C3D1"<<endl;else if(p==8 && q==3)cout<<"A1B3C1A2B4C2A3B1C3A4B2C4A5B7C5A6B8C6A7B5C7A8B6C8"<<endl;elsecout<<"impossible"<<endl;
然后当时是AC啦哈哈,200K,16MS。
希望有大牛可以给我指出第一个程序怎么修改可以直接AC,不会超时呢。。在此先行谢过!!
- POJ2488 骑士游历 A Knight's Journey 解题报告
- POJ2488 A Knight's Journey(深搜DFS,字典序,骑士游历问题)
- 【POJ2488】 A knight's Journey 解题报告 测试数据+代码+思路
- poj2488--A Knight's Journey(dfs,骑士问题)
- POJ2488 A Knight's Journey 骑士巡游 DFS
- POJ2488/openjudge 1490 A Knight's Journey 解题报告(dfs)
- poj2488 A Knight's Journey
- poj2488 - A Knight's Journey
- poj2488 A Knight's Journey
- POJ2488--A Knight's Journey
- POJ2488:A Knight's Journey
- poj2488 A Knight's Journey
- poj2488 A Knight's Journey
- poj2488---A Knight's Journey
- POJ2488---A Knight’s Journey
- poj2488 A Knight's Journey
- Poj2488 A Knight's Journey
- POJ2488 A Knight's Journey
- EXT.NET PANEL布局
- 大学对自己的一点小要求
- 开源软件测试工具的完整解决方案
- hdu 2821 Pusher (水dfs)
- 【概率论】概率论中的基本概念
- POJ2488 骑士游历 A Knight's Journey 解题报告
- 使用数据库关键字报错
- HashSet的contains方法
- 我的自考复习策略和所用资料
- C#与matlab混合编程的研究与应用
- ASP.NET页面基本对象
- SOA——01
- 【模板】
- SPI接口的Verilog HDL实现