Description
Input
Output
Sample Input
3 8 0 0 7 0 100 0 0 30 50 10 1 1 1 1
Sample Output
5 28 0
题目大意 就不多说啦 ,很简单 。
具体讲解 请看代码 :
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<string> #include<queue> using namespace std; const int MAXN = 600; struct point { int x; int y; int dis; }; int vis[MAXN][MAXN]; // 定义标记数组 int X[8]={-2,-2,-1,-1,2,2,1,1}; // 8个前进方向 int Y[8]={-1,1,-2,2,-1,1,-2,2}; int bfs(); int cango(int i,int j); // 判断能否前进的函数 int n; // 此程序中的n 即为 题干中的 l queue<point>myqueue; // 此处 把队列 定义成全局的 point start,end; // 定义起点和终点 int main() { int t; scanf("%d",&t); while (t--) { scanf("%d",&n); memset(vis,0,sizeof(vis)); scanf("%d%d",&start.x,&start.y); scanf("%d%d",&end.x,&end.y); if(start.x == end.x && start.y == end.y) { printf("0\n"); continue; } while(!myqueue.empty()) // 注意 : 此处为清空队列,非常重要 ,因为队列是全局的 所以测试每个样例 // 都要先把队列清空 ~~(不然会 WA !!) myqueue.pop(); printf("%d\n",bfs()); } return 0; } int bfs() { start.dis = 0; // 注意: start.dis 要提前赋值为 0 myqueue.push(start); vis[start.x][start.y] = 1; // 标记此点已被访问 point temp,next; while (!myqueue.empty()) { temp = myqueue.front(); myqueue.pop(); int k; for(k=0;k<8;k++) { next.x = temp.x+X[k]; next.y = temp.y+Y[k]; if(cango(next.x,next.y)) { next.dis = temp.dis + 1; if(next.x == end.x && next.y == end.y) return next.dis; myqueue.push(next); vis[next.x][next.y] = 1; } } } } int cango(int i,int j) { if(i>=0&&i<n&&j>=0&&j<n&&vis[i][j]==0) return 1; return 0; }