您的位置:首页 > 其它

poj2243 -- Knight Moves

2012-08-18 17:13 232 查看
题目意思:骑士游历的问题咯,单向广搜能过,也可以拿来练习双向广搜咯,附双向广搜代码

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: