uva439 -- Knight Moves
2017-04-15 23:34
387 查看
题目链接
这题是经典的BFS题目,没有什么坑,棋盘是固定的8*8,由于输入时不知道会有多少组数据,所以采用getline(cin,string)+stringstream来输入,然后将字符串表示的位置转换为数字表示的坐标后BFS即可,AC代码如下:
这题是经典的BFS题目,没有什么坑,棋盘是固定的8*8,由于输入时不知道会有多少组数据,所以采用getline(cin,string)+stringstream来输入,然后将字符串表示的位置转换为数字表示的坐标后BFS即可,AC代码如下:
#include <iostream> #include <sstream> #include <cstring> #include <cstdio> #include <string> #include <vector> #include <queue> using namespace std; struct Node { int r; int c; int steps; Node(int r,int c,int s):r(r),c(c),steps(s){} }; queue<Node> q; int sr,sc,er,ec; //开始位置(sr,sc),目标位置(er,ec) int visit[10][10]; int dir[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}}; char start[3]; char dest[3]; bool isInside(int r, int c) //是否越界 { if(r>=0&&r<8&&c>=0&&c<8) return true; return false; } void bfs() { while(!q.empty()) { Node node=q.front(); q.pop(); if(node.r==er&&node.c==ec) { printf("To get from %s to %s takes %d knight moves.\n",start,dest,node.steps); return; } for(int i=0;i<8;i++) { int nextr=node.r+dir[i][0]; //下一步的坐标 int nextc=node.c+dir[i][1]; if(isInside(nextr,nextc)&&!visit[nextr][nextc]) { q.push(Node(nextr,nextc,node.steps+1)); visit[nextr][nextc]=1; } } } } int main() { //freopen("test.txt","r",stdin); string line; while(getline(cin,line)) { while(!q.empty()) q.pop(); memset(visit,0,sizeof(visit)); stringstream ss(line); ss>>start>>dest; sr=start[1]-'1'; //将字符串表示的坐标转换为数字表示的坐标 sc=start[0]-'a'; er=dest[1]-'1'; ec=dest[0]-'a'; q.push(Node(sr,sc,0)); bfs(); } return 0; }
相关文章推荐
- UVA 439 Knight Moves
- UVA439 - Knight Moves
- UVA - 439 - Knight Moves (BFS)
- UVA - 439 Knight Moves
- UVA 439 Knight Moves
- UVA - 439 Knight Moves
- uva 439 knight moves
- uva439 Knight Moves
- Uva439——Knight Moves
- uva 439 Knight Moves
- uva_439 - Knight Moves
- UVA - 439 Knight Moves
- UVA 439 Knight Moves
- UVA 439(p177)----Knight Moves
- UVA - 439 Knight Moves
- 【习题 6-4 UVA-439】Knight Moves
- uva 439 - Knight Moves
- UVa 439 - Knight Moves 搜索专题
- UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves
- UVA 439 Knight Moves