1. 程式人生 > >poj1915 Knight Moves(BFS)

poj1915 Knight Moves(BFS)

pop move esp 多少 eps () mov 棋盤 front

題目鏈接

http://poj.org/problem?id=1915

題意

輸入正方形棋盤的邊長、起點和終點的位置,給定棋子的走法,輸出最少經過多少步可以從起點走到終點。

思路

經典bfs題目。

代碼

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <queue>
 5 using namespace std;
 6 
 7 struct Node
 8 {
 9     int r;
10     int c;
11 int steps; 12 13 Node(int r, int c, int steps):r(r), c(c), steps(steps){} 14 }; 15 16 const int N = 310; 17 queue<Node> q; 18 int dir[8][2]={ {-1, -2}, {-2, -1}, {-2, 1}, {-1, 2}, {1, -2}, {2, -1}, {2, 1}, {1, 2} }; 19 int n; 20 int sr, sc; 21 int er, ec; 22 int visit[N][N];
23 24 void bfs() 25 { 26 while(!q.empty()) 27 { 28 Node node = q.front(); 29 q.pop(); 30 if(node.r==er && node.c==ec) 31 { 32 cout<<node.steps<<endl; 33 return; 34 } 35 for(int i=0; i<8; i++)
36 { 37 int nr = node.r + dir[i][0]; 38 int nc = node.c + dir[i][1]; 39 if(nr>=0 && nr<n && nc>=0 && nc<n && !visit[nr][nc]) 40 { 41 visit[nr][nc] = 1; 42 q.push(Node(nr, nc, node.steps+1)); 43 } 44 } 45 } 46 } 47 48 int main() 49 { 50 //freopen("poj1915.txt", "r", stdin); 51 int t; 52 cin>>t; 53 while(t--) 54 { 55 cin>>n; 56 cin>>sr>>sc; 57 cin>>er>>ec; 58 59 memset(visit, 0, sizeof(visit)); 60 while(!q.empty()) q.pop(); 61 visit[sr][sc] = 1; 62 q.push(Node(sr, sc, 0)); 63 bfs(); 64 } 65 return 0; 66 }

poj1915 Knight Moves(BFS)