1. 程式人生 > >SDNU__1025.馬踏飛燕

SDNU__1025.馬踏飛燕


無聊的陶陶準備編寫一款遊戲,名字就叫做“馬踏飛燕”,在這款遊戲中有個一個100*100的座標,把馬放在任意一個座標點,再把燕子放在任意一個座標點,並且燕子不會移動,馬只能按照象棋規則走“日”。若4步之內能“踏”到燕子,則成功。笨蛋的陶陶不知道該怎麼去寫,現在請你幫助他。
走“日”說明:當馬的座標為(5,5)的時候,馬下一步可以走的座標有8個點,分別為(4,3)(6,3)(3,4)(7,4)(3,6)(7,6)(4,7)(6,7)


Input


第一行兩個整數,馬的起始座標x,y (0<x,y<100)
第一行兩個整數,燕子的座標m,n (0<m,n<100)


Output


若4步之內能“踏”到燕子,則輸出“Y”
若4步之內不能“踏”到燕子,則輸出“N”


Sample Input


5 5
7 4


Sample Output


Y


Source


SDNU ACM-ICPC 2011複賽(2010級)

感覺用dfs和bfs都行

用dfs吧,這個僅限制四步所以做一個if判斷就好,就把他看成尋常的地圖,只不過步數有限制

我錯的一個地方是隨便return 了,注意這個bfs並沒有遞迴,你隨便一個條件不符合就return的話是提前結束這個函式,所以是不行滴

其它的還是很好實現

#include<iostream>
#include<memory.h>
#include<queue>
using namespace std;
const int Max = 2000 + 5;//高階~~ 
//const int Max = 100 + 5; 初級馬踏飛燕 
int mp[Max][Max];
int step[Max][Max];
int foot[8][2]={2,1,2,-1,-2,1,-2,-1,1,2,1,-2,-1,-2,-1,2};
int a,b,c,d;
int flag = 0;
	
struct node{
	int x;
	int y;
};
queue<node> q;
void bfs()
{
	while(!q.empty())
	{
		if(flag)return;
		node en;
		en = q.front();
		q.pop();
		
		if(step[en.x][en.y] < 200) //4步題和200步題 
	{	node nexta;	
		int nx,ny;						//不能隨便return 這裡不是遞迴,return會直接結束這個函式 
		for(int i = 0;i < 8;i++)
		{
			
			nx = en.x + foot[i][0];
			ny = en.y + foot[i][1];
			if(nx > 0 && nx < 2000 && ny > 0 && ny < 2000 && !step[nx][ny])//100*100地圖和2000*2000地圖 
			{
				if(nx == c && ny == d)
				{
					flag = 1;
					return;
				}
				nexta.x = nx;
				nexta.y = ny;
				step[nx][ny] = step[en.x][en.y] + 1;
				q.push(nexta);
			}
		}
		
		}
	} 
}
int main()
{

	cin>>a>>b>>c>>d;
	memset(mp,0,sizeof(mp));
	memset(step,0,sizeof(step));
	node be;
	be.x = a;
	be.y = b;
	q.push(be);
	bfs();
	if(flag)
	{
		cout<<"Y"<<endl;
	}
	else
	{
		cout<<"N"<<endl;
	}
	
	return 0;
 }