您的位置:首页 > 其它

POJ 2488 A Knight's Journey

2013-04-05 00:01 309 查看
经典的骑士巡游问题,注意字典序最小,应该从上到下,从左到右遍历

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: