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,不会超时呢。。在此先行谢过!!

原创粉丝点击