poj 2488 A Knight‘s Journey

题目
①注意每个案例换行两次
impossible和Scenario 不要打错
②刚开始用string做的,因为string自带pop_back(),后来发现poj不支持,只能用字符串做了

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=30;
bool st[N][N];
char res[110];
int n,m;
int dx[]={-2,-2,-1,-1,1,1,2,2};
int dy[]={-1,1,-2,2,-2,2,-1,1};
void dfs(int x,int y,int cnt,char str[],int len)
{
	if(cnt==n*m)
	{      //如果 str的字典序比res大 
		if(strcmp(str,res)<0)  //str小,res大 
			strcpy(res,str);// 把str拷贝到res 
		return ;
	}
	for(int i=0;i<8;i++)
	{
		int a=x+dx[i],b=y+dy[i];
		if(st[a][b])continue;
		if(a<0||b<0||a>=n||b>=m)continue;
		st[a][b]=1;
		str[len]=a+'A';
		str[len+1]=b+'1';
		str[len+2]=0;
		dfs(a,b,cnt+1,str,len+2);
		st[a][b]=0;
		str[len+1]=0;
		str[len]=0;
	}
}
int main()
{
	int t;
	cin>>t;
	for(int tt=1;tt<=t;tt++)
	{
		scanf("%d%d",&m,&n);
		memset(st,0,sizeof st);
		printf("Scenario #%d:\n",tt);
		strcpy(res,"A9");
		st[0][0]=1;
		char temp[110]="A1";
		dfs(0,0,1,temp,2);
		if(strcmp(res,"A9")==0)puts("impossible\n");
		else printf("%s\n\n",res);
	}
}

版权声明:本文为weixin_49640089原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。