您的位置:首页 > 其它

HDU 1026 迷宫战斗问题 使用了优先队列

2012-08-23 09:48 447 查看
#include <iostream>
#include <queue>
#include <stdio.h>
#include <string.h>
using namespace std;

const int MAXN = 100;
struct node
{
int x, y;
int time;
friend bool operator <(node a, node b)  //time小的优先级高
{
return a.time > b.time;
}
};

priority_queue<node> que; //优先队列
struct cmp
{
int nx, ny; //记录前驱
char c;
}map[MAXN][MAXN];

int n, m;
int fight[MAXN][MAXN], mark[MAXN][MAXN];

int bfs()
{
int k;
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
node now, next;
while(!que.empty())
que.pop();
now.x = n -  1;
now.y = m - 1;
if(map[now.x][now.y].c >= '1' && map[now.x][now.y].c <= '9')
{
now.time = map[n - 1][m - 1].c - '0';
fight[now.x][now.y] =  map[now.x][now.y].c - '0';
}
else
now.time = 0;

que.push(now);
while(!que.empty())
{
now = que.top();
que.pop();
if(now.x ==0 && now.y == 0)
return now.time;
for(k = 0; k < 4; k++)
{
next.x = now.x + dir[k][0];
next.y = now.y + dir[k][1];
if(next.x >= 0 && next.x < n && next.y >= 0 && next.y < m && !mark[next.x][next.y] && map[next.x][next.y].c != 'X')
{
if(map[next.x][next.y].c >= '1' && map[next.x][next.y].c <= '9')
{
next.time = now.time + map[next.x][next.y].c - '0' + 1;
fight[next.x][next.y] = map[next.x][next.y].c - '0';
}
else
next.time = now.time + 1;
que.push(next);
map[next.x][next.y].nx = now.x;
map[next.x][next.y].ny = now.y;
mark[next.x][next.y] = 1;
}
}
}
return -1;
}

int main()
{
while(scanf("%d%d", &n, &m) != EOF)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
scanf(" %c", &map[i][j].c); //前面的空格很关键,或者直接用cin
//cin >> map[i][j].c;
mark[i][j] = fight[i][j] = 0;
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
cout << map[i][j].c ;
}
cout << endl;
}
mark[n - 1][m - 1] = 1;
int flag = bfs();
if(flag != -1)
{
printf("It takes %d seconds to reach the target position, let me show you the way.\n",flag);
int sec = 1, x = 0, y = 0;
int tx, ty;
while(sec != flag + 1)
{
printf("%ds:(%d,%d)->(%d,%d)\n",sec++,x,y,map[x][y].nx,map[x][y].ny);
for(int i = 0; i < fight[map[x][y].nx][map[x][y].ny]; i++)
printf("%ds:FIGHT AT (%d,%d)\n",sec++,map[x][y].nx,map[x][y].ny);
tx = map[x][y].nx;
ty = map[x][y].ny;
x = tx;
y = ty;
}
}
else
printf("God please help our poor hero.\n");
printf("FINISH\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: