POJ 2488 A Knight's Journey

来源:互联网 发布:流程优化的目的 编辑:程序博客网 时间:2024/06/10 14:07

经典的骑士巡游问题,注意字典序最小,应该从上到下,从左到右遍历

#include <iostream>#include <cstdio>#include <vector>using namespace std;const int maxn=30;int di[]={-1,1,-2,2,-2,2,-1,1},dj[]={-2,-2,-1,-1,1,1,2,2},n,m;bool vis[maxn][maxn];vector<char>stak;bool backtraking(int ci,int cj,int cnt){vis[ci][cj]=1;if(cnt==0){for (int i=0;i<stak.size();++i){printf("%c",stak[i]);}printf("\n");return true;}for (int i=0;i<8;++i){int ni=ci+di[i],nj=cj+dj[i];if(ni>=0&&ni<n&&nj>=0&&nj<m&&!vis[ni][nj]){stak.push_back('A'+nj),stak.push_back('1'+ni);if(backtraking(ni,nj,cnt-1))return true;stak.pop_back(),stak.pop_back();}}vis[ci][cj]=0;return false;}int main(){int t,cas=1;scanf("%d",&t);while (t--){scanf("%d%d",&n,&m);int i,j;for (int i=0;i<30;++i)for (int j=0;j<30;++j)vis[i][j]=0;printf("Scenario #%d:\n",cas++);stak.clear();for (i=0;i<m;++i){for (j=0;j<n;++j){stak.push_back('A'+i),stak.push_back('1'+j);if(backtraking(j,i,n*m-1))break;stak.pop_back(),stak.pop_back();}if(j<n)break;}if(i>=m)printf("impossible\n");printf("\n");}return 0;}


原创粉丝点击