poj 2488:A Knight's Journey

解題思路:

DFS + 路徑保存

#include<iostream>
#include<cstring>
using namespace std;

int m,r,c;
int map[30][30];	//記錄方格是否被覆蓋 
int x[100],y[100];	//記錄路徑 
int num;	//已經覆蓋的方格數 
bool flag;	//是否已經找到可行解 

void DFS(int i,int j)
{
	if(flag)
		return;
	//找到結果 
	if(num == r*c)
	{
		for(int i=0;i<num;i++)
			cout<<char(x[i]+'A'-2)<<y[i]-1;
		cout<<endl<<endl;
		flag = true;
		return;
	}
	//騎士可運動的八個方向,注意次序 
	if(map[i-2][j-1] == 1)
	{
		map[i-2][j-1] = 0;
		x[num] = i-2;
		y[num] = j-1;
		num ++;
		DFS(i-2,j-1);
		map[i-2][j-1] = 1;
		num--;
	}
	if(map[i-2][j+1] == 1)
	{
		map[i-2][j+1] = 0;
		x[num] = i-2;
		y[num] = j+1;
		num ++;
		DFS(i-2,j+1);
		map[i-2][j+1] = 1;
		num--;
	}
	if(map[i-1][j-2] == 1)
	{
		map[i-1][j-2] = 0;
		x[num] = i-1;
		y[num] = j-2;
		num ++;
		DFS(i-1,j-2);
		map[i-1][j-2] = 1;
		num--;
	}
	if(map[i-1][j+2] == 1)
	{
		map[i-1][j+2] = 0;
		x[num] = i-1;
		y[num] = j+2;
		num ++;
		DFS(i-1,j+2);
		map[i-1][j+2] = 1;
		num--;
	}
	if(map[i+1][j-2] == 1)
	{
		map[i+1][j-2] = 0;
		x[num] = i+1;
		y[num] = j-2;
		num ++;
		DFS(i+1,j-2);
		map[i+1][j-2] = 1;
		num--;
	}
	if(map[i+1][j+2] == 1)
	{
		map[i+1][j+2] = 0;
		x[num] = i+1;
		y[num] = j+2;
		num ++;
		DFS(i+1,j+2);
		map[i+1][j+2] = 1;
		num--;
	}
	if(map[i+2][j-1] == 1)
	{
		map[i+2][j-1] = 0;
		x[num] = i+2;
		y[num] = j-1;
		num ++;
		DFS(i+2,j-1);
		map[i+2][j-1] = 1;
		num--;
	}
	if(map[i+2][j+1] == 1)
	{
		map[i+2][j+1] = 0;
		x[num] = i+2;
		y[num] = j+1;
		num ++;
		DFS(i+2,j+1);
		map[i+2][j+1] = 1;
		num--;
	}
	return;
}

int main()
{
	cin>>m;
	for(int k=1;k<=m;k++)
	{
		memset(map,0,sizeof(map));
		cin>>r>>c;
		for(int i=2;i<=c+1;i++)
			for(int j=2;j<=r+1;j++)
				map[i][j] = 1;
		cout<<"Scenario #"<<k<<":"<<endl;
		flag = false;
		num = 0;
		map[2][2] = 0;
		x[0] = 2;
		y[0] = 2;
		num ++;
		DFS(2,2);
		if(flag == false)
			cout<<"impossible"<<endl<<endl;
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章