hdu 1372 Knight Moves(骑士遍历/跳马问题)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1372

题意:跳马走法,给出8*8的格子,求起点到终点的最小步数

思路:一个枝剪:马走的最大步数小于等于起终点横坐标或纵坐标相差较大的一个,,,

    (其实横纵坐标间隔相加除以2即可)

    玩了这么多年象棋竟然不知道。

#include<bits/stdc++.h>
using namespace std;
int sx,sy,ex,ey,ans;
int dx[9],dy[9];
bool flg[9][9];
void dfs(int x,int y,int cnt){
    if(x==ex&&y==ey){
        ans=min(ans,cnt);
        return;
    }
    if(cnt>=ans||cnt>=6) return;
    for(int i=1;i<=8;i++){
        if(x+dx[i]>=1&&x+dx[i]<=8&&y+dy[i]>=1&&y+dy[i]<=8&&!flg[x+dx[i]][y+dy[i]]){
            x+=dx[i];y+=dy[i];
            flg[x][y]=true;
            dfs(x,y,cnt+1);
            flg[x][y]=false;
            x-=dx[i];y-=dy[i];
        }
    }
}

int main(){
    char s1[5],s2[5];
    dx[4]=dx[1]=1; dx[2]=dx[3]=2;
    dx[5]=dx[8]=-1;dx[6]=dx[7]=-2;
    dy[3]=dy[6]=1; dy[4]=dy[5]=2;
    dy[2]=dy[7]=-1;dy[1]=dy[8]=-2;
    while(scanf("%s%s",s1,s2)==2){
        ans=0x7fffffff;
        memset(flg,0,sizeof(flg));
        sx=s1[0]-'a'+1; sy=s1[1]-'0';
        ex=s2[0]-'a'+1; ey=s2[1]-'0';
        flg[sx][sy]=true;
        dfs(sx,sy,0);
        printf("To get from %c%c to %c%c takes %d knight moves.\n",s1[0],s1[1],s2[0],s2[1],ans);
    }
    return 0;
}
    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/qq_33997572/article/details/78858841
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞