算法:搜索(骑士问题)from hihocoder
简单的bfs
#include<stdio.h> #include<string.h> #include<queue> using namespace std; struct point { int x,y; point(){} point(int xx,int yy) { x=xx;y=yy; } }; int step[4][10][10]; int dirx[8]={-2,-1,1,2,2,1,-1,-2}; int diry[8]={-1,-2,-2,-1,1,2,2,1}; void bfs(int ord,point cur) { int i,x,y,dx,dy; queue<point> q; q.push(cur); while (!q.empty()) { q.pop(); x=cur.x;y=cur.y; for (i=0;i<8;i++) { dx=dirx[i];dy=diry[i]; if (x+dx>=1&&x+dx<=8&&y+dy>=1&&y+dy<=8&&step[ord][x+dx][y+dy]==-1) { point temp(x+dx,y+dy); q.push(temp); step[ord][x+dx][y+dy]=step[ord][x][y]+1; } } cur=q.front(); } } int main() { int t,i,j,k,ans,sum,x,y; char str[5]; scanf("%d",&t); while (t--) { for (i=1;i<=3;i++) { scanf("%s",str); x=str[0]-64; y=str[1]-48; for (j=0;j<10;j++) for (k=0;k<10;k++) step[i][j][k]=-1; step[i][x][y]=0; point start; start.x=x;start.y=y; bfs(i,start); } ans=10000; for (i=1;i<=8;i++) for (j=1;j<=8;j++) { sum=0; for (k=1;k<=3;k++) sum+=step[k][i][j]; if (sum<ans) ans=sum; } printf("%d\n",ans); } return 0; }
时间: 2024-10-17 04:28:32