【搜索】[luoguP1443]马的遍历

题目

对BFS很不熟 好像要用到队列
只会写DFS暴力 八个方向搜就行 大约到一个数就不搜了弹回来

代码如下



#include<iostream>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<string>

    using namespace std;
    #define in = read()
    typedef long long ll;
    const ll size = 500 + 10;

        ll n,m,fx,fy;
        ll map[size][size];
        ll ans;

inline ll read(){
        ll num = 0 , f = 1;   char ch = getchar();

        while(!isdigit(ch)){
                if(ch == '-')   f = -1;
                ch = getchar();
        }

        while(isdigit(ch)){
                num = num*10 + ch - '0';
                ch = getchar();
        }

        return num*f;
}

void dfs(ll x,ll y,ll ans){

      if(ans > 168)   return;
      map[x][y] = ans;

      if(x + 1 <= n && y + 2 <= m &&(map[x + 1][y + 2] == -1||map[x + 1][y + 2] > ans + 1))   
              dfs(x + 1,y + 2,ans + 1);


      if(x + 2 <= n && y + 1 <= m &&(map[x + 2][y + 1] == -1||map[x + 2][y + 1] > ans + 1))   
              dfs(x + 2,y + 1,ans + 1);


      if(x - 1 >= 1 && y - 2 >= 1 &&(map[x - 1][y - 2] == -1||map[x - 1][y - 2] > ans + 1))   
              dfs(x - 1,y - 2,ans + 1);


      if(x - 2 >= 1 && y - 1 >= 1 &&(map[x - 2][y - 1] == -1||map[x - 2][y - 1] > ans + 1))   
              dfs(x - 2,y - 1,ans + 1);   


      if(x + 1 <= n && y - 2 >= 1 &&(map[x + 1][y - 2] == -1||map[x + 1][y - 2] > ans + 1))   
              dfs(x + 1,y - 2,ans + 1);


      if(x - 1 >= 1 && y + 2 <= m &&(map[x - 1][y + 2] == -1||map[x - 1][y + 2] > ans + 1))   
              dfs(x - 1,y + 2,ans + 1); 


      if(x - 2 >= 1 && y + 1 <= m &&(map[x - 2][y + 1] == -1||map[x - 2][y + 1] > ans + 1))   
              dfs(x - 2,y + 1,ans + 1);  


      if(x + 2 <= n && y - 1 >= 1 &&(map[x + 2][y - 1] == -1||map[x + 2][y - 1] > ans + 1))   
              dfs(x + 2,y - 1,ans + 1);       

}

int main(){
        n in;   m in;   fx in;    fy in;
        memset(map,-1,sizeof(map));

        dfs(fx,fy,0);

        for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++)
                        printf("%-5d",map[i][j]);
                printf("\n");
        }

}

//COYG
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值