1027.马踏飞燕(续)SDNUOJ 1027(BFS)
Description
上次的马踏飞燕是不是没玩够?无聊的lg准备编写一款游戏,就是加强版的“马踏飞燕”,在这款游戏中有个一个2000*2000的坐标,把马放在任意一个坐标点,再把燕子放在任意一个坐标点,并且燕子不会移动,马只能按照象棋规则走“日”。若200步之内能“踏”到燕子,则成功。lg不知道该怎么去写,现在请你帮助他。
走“日”说明:当马的坐标为(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<2000)
第一行两个整数,燕子的坐标 m,n (0<m,n<2000)
Output
若4步之内能“踏”到燕子,则输出“Y”
若4步之内不能“踏”到燕子,则输出“N”
Sample Input
5 5
7 4
Sample Output
Y
记得标记已访问过的点,再回到这个点是没意义的!(受 sjy 师哥启发)
该BFS模(mu)板 也是该师哥提供,略加补充
#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#include <cmath>
using namespace std;
///目标数据范围(无)
///8个方向
int dir[][2] = {2,1,1,2,-1,2,-2,1,-2,-1,-1,-2,1,-2,2,-1};
///图的界线
const int p = 2005;
const int q = 2005;
///访问标记(无)
bool vis[p][q];
///图的赋值(无)
///结构体存下标
struct node
{
int x, y, step;
}now,nex;
void bfs(int x, int y, int m,int n)
{
now.x = x;
now.y = y;
now.step = 0;
queue<node> Q;
Q.push(now);
///此点访问标记
vis[x][y] = 1;
///BFS 广搜
while(!Q.empty())
{
///首元素(排头)提取
now = Q.front();
///用完出队
Q.pop();
///检测是否符合所求
if(now.step <= 200)
{
if(now.x == m && now.y == n)
{
cout << 'Y' << '\n';
return ;
}
}
else if(now.step > 200)
{
cout << 'N' << '\n';
return ;
}
for(int i = 0; i < 8; i++)
{
///将要搜索的下一个方向的坐标
int xx = now.x + dir[i][0];
int yy = now.y + dir[i][1];
///越界不搜索
if(xx < 1 || xx > 2000 || yy < 1 || yy > 2000)
continue;
///非目标点不搜索
if(vis[xx][yy])
continue;
///搜完标记
vis[xx][yy] = 1;
nex.step = now.step + 1;
///新搜的点加入队列搜
nex.x = xx;
nex.y = yy;
Q.push(nex);
}
}
return ;
}
int main()
{
int x, y, m, n;
while(~scanf("%d%d%d%d", &x, &y, &m, &n))
{
bfs(x,y,m,n);
}
return 0;
}
智元机器人成长空间 351人发布