sdnu1025 马踏飞燕

题目

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值