POJ2488 骑士游历 A Knight's Journey 解题报告

这个题有3点要注意的地方。

1、弄清题意,p指行号,从上到下依次是1,2,3...p;q指列号,从左到右依次是A,B,C,D...,字典序输出意思是先按列排序,左边的在前,同一列的按行排序,行号小的在前。

2、递归遇到某个方块的下一步无处可跳时,返回上层之前要把vis矩阵相应位置清零!还有起始位置就是A1,如果A1无解则不需要再遍历别的情况了,直接输出impossible即可。

3、输出的时候记得在每种情况后都有一行空格。。。。。。

代码如下:

#include<iostream>
#include<stack>

using namespace std;

int vis[8][8];

struct loc{
	int x,y;
	loc(int a,int b){
		x=a;y=b;
	}
};
stack<loc> que;

void clear_que(){
	while(que.size()!=0){
		que.pop();
	}
}

bool is_full(int map[8][8],int p,int q){
	for (int i=0;i<p;i++){
		for (int j=0;j<q;j++){
			if (map[i][j]==0){
				return 0;
			}
		}
	}
	return 1;
}
/********************************/
//	x:the row number in vis[][];
//	y:the column number in vis[][];
/*********************************/
/*bool dfs(int x,int y,int p,int q){		
	if (x<0 || y<0 || x>=p || y>=q) return 0;	//out of the range
	else if (vis[x][y]==1)	return 0;
	else {
		vis[x][y]=1;
		loc location(x,y);
		que.push(location);			//将路径压入堆栈
		if (is_full(vis,p,q)) return 1; 
		if (dfs(x-1,y-2,p,q)) return 1;
		if (dfs(x+1,y-2,p,q)) return 1;
		if (dfs(x-2,y-1,p,q)) return 1;
		if (dfs(x+2,y-1,p,q)) return 1;
		if (dfs(x-2,y+1,p,q)) return 1;
		if (dfs(x+2,y+1,p,q)) return 1;
		if (dfs(x-1,y+2,p,q)) return 1;
		if (dfs(x+1,y+2,p,q)) return 1;
		que.pop();				//到此说明无路可走,所以该点不能加入路径,出栈
		vis[x][y]=0;				//清除记录,勿忘!
		return 0;
	}
}
int main(){
	int cases;
	cin>>cases;
	int count=0;
	while(cases--){
		count++;
		clear_que();
		memset(vis,0,sizeof(vis));
		int p,q;
		cin>>p>>q;
		cout<<"Scenario #"<<count<<":"<<endl;
		
		if (dfs(0,0,p,q)) {
			stack<loc> out;
			while(!que.empty()){			//因为是逆序的,所以要另一个堆栈
				out.push(que.top());
				que.pop();
				}
			while(!out.empty()){
				cout<<(char)('A'+out.top().y)<<out.top().x+1;
				out.pop();
				}
			cout<<endl;
		}		
		else {cout<<"impossible"<<endl;}
	}
	return 0;
}
提交后说超时了,反正情况也不多,只好打表了,一共12种情况下有同路,其余均为impossible。

if(p==1 &&q ==1)
			cout<<"A1"<<endl;
		else if(p==3 && q==4)
			cout<<"A1C2A3B1D2B3C1A2C3D1B2D3"<<endl;
		else if(p==3 && q==7)
			cout<<"A1B3D2F1G3E2G1F3E1G2E3C2A3B1C3A2C1D3B2D1F2"<<endl;
		else if(p==3 && q==8)
			cout<<"A1B3C1A2C3D1B2D3E1G2E3C2A3B1D2F1H2F3G1E2G3H1F2H3"<<endl;
		else if(p==4 && q==3)
			cout<<"A1B3C1A2B4C2A3B1C3A4B2C4"<<endl;
		else if(p==4 && q==5)
			cout<<"A1B3C1A2B4D3E1C2D4E2C3A4B2D1E3C4A3B1D2E4"<<endl;
		else if(p==4 && q==6)
			cout<<"A1B3C1A2B4C2D4E2F4D3E1F3D2B1A3C4B2A4C3E4F2D1E3F1"<<endl;
		else if(p==5 && q==4)
			cout<<"A1B3A5C4D2B1A3B5D4C2B4A2C1D3C5A4B2D1C3D5"<<endl;
		else if(p==5 && q==5)
			cout<<"A1B3A5C4A3B1D2E4C5A4B2D1C3B5D4E2C1A2B4D5E3C2E1D3E5"<<endl;
		else if(p==6 && q==4)
			cout<<"A1B3A5C6D4B5D6C4D2B1A3C2B4A2C1D3B2D1C3D5B6A4C5A6"<<endl;
		else if(p==7 && q==3)
			cout<<"A1B3C1A2C3B1A3C2B4A6C7B5A7C6A5B7C5A4B2C4B6"<<endl;
		else if(p==7 && q==4)
			cout<<"A1B3A5B7D6B5A7C6D4C2A3B1D2C4B2A4B6D7C5A6C7D5B4D3C1A2C3D1"<<endl;
		else if(p==8 && q==3)
			cout<<"A1B3C1A2B4C2A3B1C3A4B2C4A5B7C5A6B8C6A7B5C7A8B6C8"<<endl;
		else
			cout<<"impossible"<<endl;

然后当时是AC啦哈哈,200K,16MS。

希望有大牛可以给我指出第一个程序怎么修改可以直接AC,不会超时呢。。在此先行谢过!!

你可能感兴趣的:(C++,递归,栈,ACM,poj)