现在做这些题就当水题来做了,想当初拿来别人的代码看着就费劲,唉,这东西还是熟能生巧,继续加油ac吧
题目要求,一个象棋棋牌,给出起始位置,有个马,走日子,最少走几步能走到终止位置上
简单的bfs用队列模拟,不过需要注意的是8个方向可以用一个数组来循环使用
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#define N 301
using namespace std;
int map[N][N];
bool used[N][N];
int len,stx,sty,enx,eny;
queue<int>Q;
int dir[8][2]={1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1};
int bfs()
{
int x,y,temp;
memset(map,-1,sizeof(map));
memset(used,false,sizeof(used));
while(Q.size())
Q.pop();
used[stx][sty]=true;
map[stx][sty]=0;
Q.push(stx);
Q.push(sty);
while(Q.size())
{
x=Q.front();Q.pop();
y=Q.front();Q.pop();
for(int i=0;i<8;i++)
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(!used[xx][yy]&&xx>=0&&xx<len&&yy>=0&&yy<len)
{
map[xx][yy]=map[x][y]+1;
used[xx][yy]=true;
Q.push(xx);Q.push(yy);
}
}
if(used[enx][eny])break;
}
return map[enx][eny];
}
int main()
{
int ca;
scanf("%d",&ca);
while(~scanf("%d%d%d%d%d",&len,&stx,&sty,&enx,&eny))
printf("%d\n",bfs());
}

浙公网安备 33010602011771号