您的位置:首页 > 其它

【HDOJ】3345 War Chess

2015-02-10 16:32 106 查看
简单BFS。注意最后一组数据,每个初始点不考虑周围是否有敌人。

/* 3345 */
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
using namespace std;

#define MAXN 105
#define INF  0xfffff

typedef struct node_t {
int x, y, e;
node_t() {}
node_t(int xx, int yy, int ee) {
x = xx; y = yy; e = ee;
}
} node_t;

char map[MAXN][MAXN];
bool stop[MAXN][MAXN];
int hp[MAXN][MAXN];
int hurt[MAXN][MAXN];
int n, m, mv;
int bx, by;
int dir[4][2] = {
-1,0,0,-1,1,0,0,1
};

void init() {
int i, j, k;

memset(stop, false, sizeof(stop));
memset(hurt, -1, sizeof(hurt));
for (i=1; i<=n; ++i) {
for (j=1; j<=m; ++j) {
if (map[i][j] == 'E') {
stop[i-1][j] = stop[i][j-1] = stop[i+1][j] = stop[i][j+1] = true;
hurt[i][j] = INF;
} else if (map[i][j] == 'Y') {
bx = i;
by = j;
} else if (map[i][j] == '.') {
hurt[i][j] = 1;
} else if (map[i][j] == 'T') {
hurt[i][j] = 2;
} else if (map[i][j] == 'R') {
hurt[i][j] = 3;
} else if (map[i][j] == 'P') {
hurt[i][j] = 1;
} else if (map[i][j] == '#') {
hurt[i][j] = INF;
}
}
}
}

bool check(int x, int y) {
return x<=0 || x>n || y<=0 || y>m;
}

void bfs() {
int x, y, e;
int i, j, k;
queue<node_t> Q;
node_t nd;

memset(hp, -1, sizeof(hp));
//if (stop[bx][by] == false)
Q.push(node_t(bx,by,mv));
hp[bx][by] = mv;

while (!Q.empty()) {
nd = Q.front();
Q.pop();

for (i=0; i<4; ++i) {
x = nd.x + dir[i][0];
y = nd.y + dir[i][1];
if (check(x, y))
continue;
e = nd.e - hurt[x][y];
if (e > hp[x][y]) {
hp[x][y] = e;
if (stop[x][y] == false)
Q.push(node_t(x, y, e));
}
}
}
}

void merge() {
int i, j, k;

for (i=1; i<=n; ++i) {
for (j=1; j<=m; ++j) {
if (hp[i][j]>=0 && map[i][j]!='P') {
map[i][j] = '*';
}
}
}
map[bx][by] = 'Y';
}

int main() {
int t;
int i, j, k;

#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif

scanf("%d", &t);
while (t--) {
scanf("%d %d %d", &n, &m, &mv);
for (i=1; i<=n; ++i)
scanf("%s", map[i]+1);
init();
bfs();
merge();
for (i=1; i<=n; ++i)
printf("%s\n", map[i]+1);
printf("\n");
}

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