现在做这些题就当水题来做了,想当初拿来别人的代码看着就费劲,唉,这东西还是熟能生巧,继续加油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()); }