来源:http://poj.org/problem?id=1915
题意:就是给你一个边长为n的国际象棋棋盘,然后给了你王后的走法,并且给出起点和终点,求从起点到终点需要多少步。
思路:简单的bfs。
代码:
#include <iostream>
#include <cstdio>
#include <string.h>
#include <queue>
using namespace std;
#define CLR(arr,val) memset(arr,val,sizeof(arr))
const int N = 310;
int flag[N][N],len,sx,sy,ex,ey;
struct point{
int x,y,step;
};
int addx[8] = {-2,-1,1,2,2,1,-1,-2};
int addy[8] = {-1,-2,-2,-1,1,2,2,1};
int bfs(){
point pp;
pp.x = sx;
pp.y = sy;
pp.step = 0;
flag[sx][sy] = 1;
queue<point> qq;
qq.push(pp);
while(!qq.empty()){
point tpp = qq.front();
qq.pop();
if(tpp.x == ex && tpp.y == ey){
return tpp.step;
}
for(int i = 0; i < 8; ++i ){
int newx = tpp.x + addx[i];
int newy = tpp.y + addy[i];
if(newx >= 0 && newx < len && newy >= 0 && newy < len && !flag[newx][newy]){
flag[newx][newy] = 1;
point newpp;
newpp.x = newx;
newpp.y = newy;
newpp.step = tpp.step + 1;
qq.push(newpp);
}
}
}
}
int main(){
int numcase;
scanf("%d",&numcase);
while(numcase--){
scanf("%d",&len);
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
CLR(flag,0);
int ans = bfs();
printf("%d\n",ans);
}
return 0;
}