poj2243 -- Knight Moves
2012-08-18 17:13
232 查看
题目意思:骑士游历的问题咯,单向广搜能过,也可以拿来练习双向广搜咯,附双向广搜代码
View Code
View Code
#include <iostream> #include <queue> #include <cstdio> using namespace std; #define MAX 10 struct Status // 结构 { int x,y; //位置 int vis; }; int visited[MAX][MAX];//标记数组 int dir[8][2]={{-2, -1}, {-2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {1, 2}, {2, -1}, {2, 1}}; int n,m;// n * m 矩形 int ans[MAX][MAX];//标记前面走了多少步 int result;//结果走的步数 queue<Status> Q1; // 正向队列 queue<Status> Q2; // 反向队列 bool found; //标记成功找到 Status s1,s2;//s1开始位置 s1结束位置 void BFS_expand(queue<Status> &Q,bool flag) { Status s,t; s=Q.front(); // 从队列中得到头结点s Q.pop(); for(int i=0;i<8;i++) { t.x=s.x+dir[i][0]; t.y=s.y+dir[i][1]; t.vis = s.vis + 1; if(t.x>=1 && t.x<=n && t.y>=1 && t.y<=m ) // 判是否越界 { if(flag) // 在正向队列中判断 { if (visited[t.x][t.y]!=1) // 没在正向队列出现过 { if(visited[t.x][t.y]==2) // 该状态在反向队列中出现过 { found=true; result = ans[t.x][t.y] + ans[s.x][s.y]; return; } ans[t.x][t.y] = t.vis; visited[t.x][t.y]=1; // 标记为在在正向队列中 Q.push(t); // 入队 } } else // 在反向队列中判断 { if (visited[t.x][t.y]!=2) // 没在反向队列出现过 { if(visited[t.x][t.y]==1) // 该状态在正向向队列中出现过 { found=true; result = ans[t.x][t.y] + ans[s.x][s.y]; return; } ans[t.x][t.y] = t.vis; visited[t.x][t.y]=2; // 标记为在反向队列中 Q.push(t); // 入队 } } } } } void TBFS() { memset(visited,0,sizeof(visited)); // 判重数组 while(!Q1.empty()) Q1.pop(); // 正向队列 while(!Q2.empty()) Q2.pop(); // 反向队列 //======正向扩展的状态标记为1,反向扩展标记为2 visited[s1.x][s1.y]=1; // 初始状态标记为1 visited[s2.x][s2.y]=2; // 结束状态标记为2 s1.vis = 0; s2.vis = 1; ans[s1.x][s1.y] = 0; ans[s2.x][s2.y] = 1; Q1.push(s1); // 初始状态入正向队列 Q2.push(s2); // 结束状态入反向队列 while(!Q1.empty() || !Q2.empty()) { if(!Q1.empty()) BFS_expand(Q1,true); // 在正向队列中搜索 if(found) // 搜索结束 return ; if(!Q2.empty()) BFS_expand(Q2,false); // 在反向队列中搜索 if(found) // 搜索结束 return ; } } int main(void) { n=8; m=8; char anss[2][4]; while(scanf("%s %s",anss[0],anss[1])!=EOF) { found = false; if(strcmp(anss[0],anss[1])==0) { printf("To get from %s to %s takes 0 knight moves.\n",anss[0],anss[1]); } else { s1.x = anss[0][0]-'a'+1; s1.y = anss[0][1] - '0'; s2.x = anss[1][0]-'a'+1; s2.y = anss[1][1] - '0'; result = 0; TBFS(); printf("To get from %s to %s takes %d knight moves.\n",anss[0],anss[1],result); } } return 0; }
相关文章推荐
- POJ-2243-Knight Moves
- poj 2243 Knight Moves
- POJ---2243 Knight Moves 使用A*算法的广度优先搜索
- 【POJ 2243】Knight Moves
- poj 2243 Knight Moves
- poj 2243 -- Knight Moves (bfs)
- POJ 2243 Knight Moves
- POJ 2243 Knight Moves
- POJ 2243-Knight Moves
- POJ 2243 Knight Moves
- poj 2243 Knight Moves
- poj 2243 Knight Moves
- POJ---2243 Knight Moves 使用A*算法的广度优先搜索
- poj 2243:Knight Moves
- POJ 2243 Knight Moves
- poj 2243 Knight Moves
- POJ 2243 Knight Moves
- poj1915——Knight Moves
- POJ-1915 Knight Moves
- POJ 2243 Knight Moves【A*算法入门演练】