骑士游历

来源:互联网 发布:合肥租房知乎 编辑:程序博客网 时间:2024/04/16 16:14

题意:给出一个p行q列的国际棋盘,马可以从任意一个格子开始走,问马能否不重复的走完所有的棋盘。如果可以,输出按字典序排列最小的路径。打印路径时,列用大写字母表示(A表示第一列),行用阿拉伯数字表示(从1开始),先输出列,再输出行。

思路:典型的深度优先搜索题。

#include <stdio.h>#include <stdlib.h>#include <iostream>#include <string.h>#include <algorithm>#include <queue>#include <stack>using namespace std;int n,p,q,vis[100][100];int dy[8]={-2,-2,-1,-1,1,1,2,2},dx[8]={-1,1,-2,2,-2,2,-1,1};struct point{int x; int y;};stack<point>path;stack<point>puting;char change(int x){return 'A'+x-1;}int dfs(int x,int y,int visit){if(visit==p*q)return 1; int i; for(i=0;i<8;i++) {int nx,ny;  struct point nu;  nx=x+dx[i];  ny=y+dy[i];  if(nx>=1&&nx<=p&&ny>=1&&ny<=q&&!vis[nx][ny])  {vis[nx][ny]=1;   nu.x=nx;   nu.y=ny;   path.push(nu);   if(dfs(nx,ny,visit+1))return 1;   path.pop();   vis[nx][ny]=0;  } } return 0;}void printway(){while(!path.empty()) {struct point ff;  ff=path.top();  puting.push(ff);  path.pop();  } while(!puting.empty()) {struct point ff;  ff=puting.top();  puting.pop();   cout<<change(ff.y)<<ff.x; } cout<<endl;}int main(){int i,j,k; cin>>n; for(k=1;k<=n;k++) {memset(vis,0,sizeof(vis));  while(!path.empty())path.pop();  cin>>p>>q;  vis[1][1]=1;  struct point start;  start.x=1;start.y=1;  path.push(start);  cout<<"Scenario #"<<k<<":"<<endl;  if(p==1&&q==1)cout<<"A1"<<endl;  else if(dfs(1,1,1)==0)cout<<"impossible"<<endl;  else printway();  cout<<endl; } system("PAUSE");  return 0;}



原创粉丝点击