Sicily 1936. Knight Moves
题目地址:1936. Knight Moves
思路:
这道题一开始不理解题意…orz...囧,看大神们理解的。
题意是说一个8*8的国际象棋,骑士以马的形式走动(“日”字型),指定两个点,输出最小的步骤。
可以利用广度搜索解决。
具体代码如下:
1 #include <iostream> 2 #include <queue> 3 #include <cstring> 4 #include <string> 5 using namespace std; 6 7 int dx[] = {-1, -2, -2, -1, 1, 2, 2, 1}; //可以走八个方向 8 int dy[] = {-2, -1, 1, 2, 2, 1, -1, -2}; 9 10 bool visited[100]; 11 12 int main() { 13 int t; 14 cin >> t; 15 while (t--) { 16 memset(visited, false, sizeof(visited)); 17 int distance[100] = {0}; 18 19 string node1, node2; 20 cin >> node1 >> node2; 21 22 int X = (node1[0]-'a')*8 + node1[1]-'1'; 23 int Y = (node2[0]-'a')*8 + node2[1]-'1'; 24 25 queue<int> store; 26 store.push(X); 27 while (!store.empty()) { 28 if (store.front() == Y) 29 break; 30 31 int x = store.front()/8; 32 int y = store.front()%8; 33 34 for (int i = 0; i < 8; i++) { 35 int nx = x+dx[i]; 36 int ny = y+dy[i]; 37 38 if (nx < 0||nx > 7||ny < 0||ny > 7) 39 continue; 40 int temp = nx*8 + ny; 41 42 if (!visited[temp]) { 43 store.push(temp); 44 visited[temp] = true; 45 distance[temp] = distance[store.front()] + 1; 46 } 47 } 48 store.pop(); 49 } 50 cout << "To get from " << node1 51 << " to " << node2 << " takes " 52 << distance[Y] << " knight moves.\n"; 53 } 54 55 return 0; 56 } 57