POJ 2488 A Knight's Journey

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

 

#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;
}


 

 

posted @ 2013-04-05 00:01  坚固66  阅读(138)  评论(0编辑  收藏  举报