POJ 2488

//此题关键是字典序怎么理解的问题
#include<iostream>
using namespace std;
struct Node{
	int x,y;	
};
Node nd[64];
Node output[64];
int visited[50][50];
int res;
int row,col,x,y,k;
bool ans,flag;
int direc[8][2]={
	{-1,-2},{1,-2},
	{-2,-1},{2,-1},
	{-2,1},{2,1},
	{-1,2},{1,2}
	};

bool check(int x,int y){
		if(x<0||y<0||x>=row||y>=col)
			return false;
		return true;
}

void dfs(int a,int b){
	if(flag)
		return;
	visited[a][b]=true;
	nd[res].x=a;
	nd[res].y=b;
	res++;
	if(res==row*col){
		ans=true;
		flag=true;
		for(int i=0;i<row*col;i++){
			output[i].x=nd[i].x;
			output[i].y=nd[i].y;
		}
		return;
	}
	for(int i=0;i<8;i++){
		if(check(a+direc[i][0],b+direc[i][1])&&visited[a+direc[i][0]][b+direc[i][1]]==false){
			dfs(a+direc[i][0],b+direc[i][1]);
			res--;
			visited[a+direc[i][0]][b+direc[i][1]]=false;
		}
	}
}

int main(){
	int n;
	scanf("%d",&n);
	k=0;
	while(n--){
		k++;
		printf("Scenario #%d:\n",k);
		scanf("%d%d",&row,&col);
		memset(visited,0,sizeof(visited));
		res=0;
		ans=flag=false;
		dfs(0,0);
		if(ans){
			for(int i=0;i<col*row;i++){
				printf("%c%d",char(output[i].y+1+64),output[i].x+1);
			}
			printf("\n");
		}
		else{
			printf("impossible\n");
		}
		printf("\n");
	}
	return 0;
}

你可能感兴趣的:(POJ 2488)