题目
Description
无聊的陶陶准备编写一款游戏,名字就叫做“马踏飞燕”,在这款游戏中有个一个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)
Ouput
若4步之内能“踏”到燕子,则输出“Y”
若4步之内不能“踏”到燕子,则输出“N”
Sample Input
5 5
7 4
Sample Output
Y
思路
我看似乎所有人都在bfs…我个人为什么觉得dfs反而好做一些…?
遇到的问题
1.没有记录走过的点,走回头路
2.如果动用x,y本身记得后退一步,回溯
代码
#include<iostream>
#include<cstdio>
using namespace std;
int m,n,r=0;
int a[8]={2,2,1,1,-1,-1,-2,-2},c[8]={1,-1,2,-2,2,-2,1,-1};
bool b[101][101]={0};
void search(int x,int y,int sum)
{
if(x==m&&y==n)
{
r=1;
return;
}
if(sum==4) return;
for(int i=0;i<8;i++)
{
x=x+a[i];
y=y+c[i];
if(x>0&&x<100&&y>0&&y<100&&b[x][y]==0)
{
b[x][y]=1;
search(x,y,sum+1);
b[x][y]=0;
}
x=x-a[i];
y=y-c[i];
}
}
int main()
{
int x,y;
scanf("%d %d",&x,&y);
scanf("%d %d",&m,&n);
search(x,y,0);
if(r==1) printf("Y\n");
else printf("N\n");
return 0;
}