POJ2488——简单DFS

来源:互联网 发布:recyclerview清空数据 编辑:程序博客网 时间:2024/04/29 23:13

Question:

题目中给出了国际象棋的地图,要求我们将马按照他的走子方式进行移动,能够将整个棋盘走遍则我们将走姿方式按照字典序进行输出,否则输出impossible

Solution:


本题主要考察的是方向数组的顺序,首先,我们需要明确一点,如果我们要按照字典序进行输出的话并且还要踩遍整个棋盘,我们那必定会经过A1点,所以说我们的顺序必定是开头是A1的一组字典序顺序
按照上图的方向数组的选择方式我们可以轻松的是实现个路径记录的DFS

Code:

#include"iostream"#include"cstdio"#include"cstdlib"#include"cstring"using namespace std;typedef struct node{int x;int y;}point;point queue[30*30];int nownum;int p,q;int book[30][30];int move[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};bool dfs(int x,int y){if(nownum==p*q) return true;for(int i=0;i<8;i++){int dx=x+move[i][0];int dy=y+move[i][1];if(dx<1||dx>p||dy<1||dy>q||book[dx][dy]==1) continue;else{book[dx][dy]=1;queue[++nownum].x=dx;queue[nownum].y=dy;if(dfs(dx,dy)) return true;else{nownum--;book[dx][dy]=0;}} }return false;}int main(){int t;cin>>t;int j=1;while(t--){memset(book,0,sizeof(book));memset(queue,0,sizeof(queue));nownum=0;cin>>p>>q;cout<<"Scenario #"<<j<<":"<<endl;j++;book[1][1]=1;queue[1].x=queue[1].y=1;nownum++;if(dfs(1,1)){for(int i=1;i<=p*q;i++) printf("%c%d",(char)(queue[i].y+64),queue[i].x);cout<<endl;}else cout<<"impossible"<<endl;if(t!=0) cout<<endl; }return 0;} 


0 0
原创粉丝点击