POJ 2488 A Knight's Journey

题意:让一个骑士走遍所给棋盘,按字典序输出。

 题解:直接DFS但是需要回溯,我一开始没想到怎么按字典序跑,后来先定下来搜索的顺序,保证一旦搜出来就是字典序最小的,然后因为反正要遍历,干脆就从左上角开始。这样的字典序一定是最小的了。
  
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,flag;
int vis[30][30];
int p1[30],p2[30];
int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};
int check(int x,int y){
	if(x<1||x>n)return 0;
	if(y<1||y>m)return 0;
	if(vis[x][y])return 0;
	if(flag)return 0;
	return 1;
}
void dfs(int x,int y,int deep){
	//vis[x][y]=1;
	p1[deep]=x;
	p2[deep]=y;
	if(deep==n*m){
		flag=1;
		return ;
	}
	int i,xx,yy;
	for(i=0;i<8;i++){
		yy=y+dir[i][0];
		xx=x+dir[i][1];
		if(check(xx,yy)){
			vis[xx][yy]=1;
			dfs(xx,yy,deep+1);
			vis[xx][yy]=0;
		}
	}

}
int main()
{
	int i,t,icase=0;
	scanf("%d",&t);
	while(t--){
		flag=0;
		memset(vis,0,sizeof(vis));
		vis[1][1]=1;
		icase++;
		scanf("%d%d",&n,&m);
		dfs(1,1,1);
		printf("Scenario #%d:\n",icase);
		if(flag){
			for(i=1;i<=m*n;i++)printf("%c%d",p2[i]+'A'-1,p1[i]);
			printf("\n\n");
		}
		else printf("impossible\n\n");
	}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/nwpu2017300135/article/details/79796095