题目: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;
}