【搜索】[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
posted @ 2017-09-06 09:24  ars4me  阅读(179)  评论(0)    收藏  举报