POJ2488

//10790086	c00h00g	2488	Accepted	256K	0MS	C++	922B	2012-09-10 14:05:42
//我的vs 2005绝对是不能用了,竟然输出结果都是错误的,在visual c++ 6.0上就成功了
//这一题要求按照地点序列输出就要求按照指定的方向来寻找,行用1,2,3...标识,列用A,B,C...来标识
//考察:深搜+回溯
#include<iostream>
using namespace std;

int dir[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
int N,p,q;
int visited[27][27];
struct Node{
	int x,y;
};
Node nd[28];
bool res;

void dfs(int x,int y,int len){
	if(res)
		return;
	visited[x][y]=1;
	nd[len].x=x;
	nd[len].y=y;
	if(len==p*q){
		res=true;
		for(int i=1;i<=len;i++)
			cout<<(char)(nd[i].y+64)<<nd[i].x;
		return;
	}
	for(int i=0;i<8;i++){
		int a=x+dir[i][0];
		int b=y+dir[i][1];
		if(a>0&&a<=p&&b>0&&b<=q){
			if(visited[a][b]==0&&res==false){
				dfs(a,b,len+1);	
				if(res)
					return;//若已经找到则不回溯,直接返回
				visited[a][b]=0;//回溯
			}
		}
	}
}
int main(){
	cin>>N;
	int k=0;
	while(N--){
		k++;
		cout<<"Scenario #"<<k<<":"<<endl;
		cin>>p>>q;
		memset(visited,0,sizeof(visited));
		res=false;
		dfs(1,1,1);
		if(res==false)
		    cout<<"impossible\n";
		else 
			cout<<endl;
		cout<<endl;
	}
	return 0;
}

你可能感兴趣的:(C++,c,struct)