UVA-439(Knight Moves)
阿新 • • 發佈:2018-11-26
UVA-439(Knight Moves)
題目:
https://cn.vjudge.net/problem/UVA-439
程式碼如下:
#include<bits/stdc++.h> using namespace std; #define MAX 11 string s1,s2; int a1,a2,b1,b2; int direction [8][2] = {{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};//一個點走向其它點的不同可能 int vis[MAX][MAX];//用於判重 struct Node //每個結點裡有點的橫縱座標以及到達這個點所需步數 { int x,y,step; Node(int xx,int yy,int step1):x(xx),y(yy),step(step1){} }; int bfs() { int dx,dy; memset(vis,1,sizeof(vis)); queue<Node> p; p.push(Node(a1,b1,0)); vis[a1][b1] = 0; while(!p.empty()) { Node head = p.front(); p.pop(); if(head.x == a2 && head.y == b2) return head.step; for(int i = 0;i < 8;i++) { dx = head.x + direction[i][0]; dy = head.y + direction[i][1]; if(dx > 0 && dx <= 8 && dy > 0 && dy <= 8 && vis[dx][dy]) { vis[dx][dy] = 0; p.push(Node(dx,dy,head.step + 1)); } } } return -1; } int main() { while(cin >> s1 >> s2) { a1 = s1[0] - 'a' + 1; b1 = s1[1] - '0'; a2 = s2[0] - 'a' + 1; b2 = s2[1] - '0'; cout << "To get from " << s1 << " to " << s2 << " takes " << bfs() << " knight moves." << endl; } return 0; }
分析:
首先把輸入的字元全部轉換為數字,然後定義一個結構體,每個結構體都代表一個點的橫縱座標以及到達這個點的步數,在進行bfs操作的時候,首先把每個點都重置為1(也就是把每個點都重置為新點),同樣也定義一個佇列只不過佇列中的元素是結構體Node,隨後把起點Node入隊,然後把這個點賦值0(此時這個點就是舊點了)。隨後列舉這個點可以走向別的點的可能,如果到達的點是新點且不越界那就入隊,入隊後這個點就變為舊點且步數加1。
另外每次出隊的時候都需要判斷這個點是否為終點,如果是的則輸出這個點的step,如果不是則繼續。