您的位置:首页 > 其它

广搜_优先队列和记录搜索路径(HDU_1026)

2013-04-21 20:03 429 查看
#include <stdio.h>
#include <string.h>
#include <queue>
#include <stack>

using namespace std;

#define M    105

typedef struct Node{
int row,col,step,f_row,f_col,count;

friend bool operator < (const Node a,const Node b)
{
return a.step>b.step;
}
} Node;

const int move[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
char map[M][M];
int n,m,sum;

priority_queue<Node> Q;
queue<Node> __Q;
stack<Node> S,__S;

void __clear()
{
while(!Q.empty())    Q.pop();
while(!S.empty())    S.pop();
while(!__Q.empty())    __Q.pop();
while(!__S.empty())    __S.pop();
}

int jud(Node temp)
{
if(temp.row>=0 && temp.row<n && temp.col>=0 && temp.col<m && map[temp.row][temp.col]!='X')    return 1;
return 0;
}

void bfs()
{
__clear();
Node temp,add;
temp.row=temp.col=temp.step=0;
temp.f_row=temp.f_col=-1;
temp.count=0;
map[temp.row][temp.col]='X';
Q.push(temp);
while(!Q.empty())
{
temp=Q.top();
Q.pop();
__Q.push(temp);
if(temp.row==n-1 && temp.col==m-1)
{
sum=temp.step;
return ;
}
for(int i=0;i<4;i++)
{
add.row=temp.row+move[i][0];
add.col=temp.col+move[i][1];
add.f_row=temp.row;
add.f_col=temp.col;
if(!jud(add))    continue;
add.step=temp.step+1;
add.count=0;
if(map[add.row][add.col]!='.')
{
add.step=add.step+map[add.row][add.col]-'0';
add.count=map[add.row][add.col]-'0';
}
map[add.row][add.col]='X';
Q.push(add);
}
}
}

void show_path()
{
while(!__Q.empty())
{
S.push(__Q.front());
__Q.pop();
}

int __f_row=S.top().row;
int __f_col=S.top().col;
while(!S.empty())
{
Node temp=S.top();
S.pop();
if(!(__f_row ==temp.row && __f_col ==temp.col))    continue;
__f_row=temp.f_row;
__f_col=temp.f_col;
__S.push(temp);
}

int i=1;
if(sum)    printf("It takes %d seconds to reach the target position, let me show you the way.\n",sum);
else
{
printf("God please help our poor hero.\nFINISH\n");
return ;
}
while(!__S.empty())
{
Node temp=__S.top();
__S.pop();
if(temp.f_row==-1 && temp.f_col==-1)    continue;
printf("%ds:(%d,%d)->(%d,%d)\n",i++,temp.f_row,temp.f_col,temp.row,temp.col);
if(temp.count)    while(temp.count--)    printf("%ds:FIGHT AT (%d,%d)\n",i++,temp.row,temp.col);
//        printf("row=%d,col=%d,step=%d,f_row=%d,f_col=%d\n",temp.row,temp.col,temp.step,temp.f_row,temp.f_col);
}
printf("FINISH\n");
}

int main(int argc, char *argv[])
{
#ifdef __LOCAL
freopen("in.txt","r",stdin);
#endif

while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%s",map[i]);
sum=0;
bfs();
show_path();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: