SDNU__1025.馬踏飛燕
阿新 • • 發佈:2019-02-18
無聊的陶陶準備編寫一款遊戲,名字就叫做“馬踏飛燕”,在這款遊戲中有個一個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; }