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;

}


 

 

你可能感兴趣的:(poj)