您的位置:首页 > 其它

hdu 3442 Three Kingdoms(ACM 暑假比赛)

2010-07-14 00:47 267 查看
]/*
多校联合比赛,本来这道题目可以写出来的,方法都是想对的,可是为何到最后还是改不出来的
还以为是自己的算法错了,后来发现没有,xwc说也是用这个算法的,但是我还是改不出来,后来跟他一起
我发现我致命的错误,为何比赛的时候就是改不出来呢??为何每次写代码都是那么悲剧的,总是有小小的错误
有学以着,写入文件

题目的意思也是很容易理解的,priority_queue + BFS 就OK了
Manhattan distance:(这个需要注意的)The distance between two points measured along axes at right angles.
In a plane with p1 at (x1, y1) and p2 at (x2, y2), it is |x1 - x2| + |y1 - y2|.
*/
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace  std;

int dx1[4] = {1, 0, -1, 0};
int dy1[4] = {0, 1, 0, -1};

const int N = 105;
char map

;
bool hash

;
struct node
{
int x;
int y;
int dam;
bool fa;
bool fb;
bool fc;
bool fd;
bool fe;
friend bool operator < (node a, node b)
{
return a.dam > b.dam;
}
};
int sx, sy, ex, ey;
int T;
FILE *input = fopen("slave.txt", "w" );

bool BFS(int n, int m)
{
memset(hash, false, sizeof(hash));
hash[sx][sy] = true;
priority_queue<node> Q;
node P, M, G, H, O;
M.dam = 0;
M.fa = false;
M.fb = false;
M.fc = false;
M.fd = false;
M.fe = false;
M.x = sx;
M.y = sy;
Q.push(M);
while (!Q.empty())
{
P = Q.top();
Q.pop();
if(map[P.x][P.y] == '!')
{
//printf("%d---/n", P.fb);
fprintf(stdout, "Case %d: %d/n", T, P.dam);
return true;
}
for(int i = 0; i < 4; i++)
{
M = P;
M.x += dx1[i];
M.y += dy1[i];
// When Liu Bei reach the destination,you should first judge the attack damage at
// the destination then finish the game.  这句话开始理解的时候感觉很困惑,于是开始没有算最后一点的
// 										  伤害值,但是比赛的时候改了

/*
if(M.x >= 0 && M.x < n && M.y >= 0 && M.y < m && map[M.x][M.y] == '!')
{
printf("Case %d: %d/n", T, M.dam);
return true;
}
*/
if((map[M.x][M.y] == '.' || map[M.x][M.y] == 'C' || map[M.x][M.y] == '!')
&& !hash[M.x][M.y] && M.x >= 0 && M.x < n && M.y >= 0 && M.y < m)
{
if(!M.fc &&  map[M.x][M.y] == 'C')
{
M.dam += 3;
M.fc = true;
}
hash[M.x][M.y] = true;
for(int j = 0; j < 4; j++)
{
G = M;
G.x += dx1[j];
G.y += dy1[j];
if(G.x >= 0 && G.x < n && G.y >= 0 && G.y < m)
{
if(map[G.x][G.y] == 'E' && !M.fe)
{
M.dam += 5;
M.fe = true;
}

if(map[G.x][G.y] == 'A' && !M.fa)
{
M.dam += 1;
M.fa = true;

}

if(map[G.x][G.y] == 'D' && !M.fd)
{
M.dam += 4;
M.fd = true;
}

if(map[G.x][G.y] == 'B' && !M.fb)
{
M.dam += 2;
M.fb = true;

}

for(int k = 0; k < 4; k++)
{
H = G;
H.x += dx1[k];
H.y += dy1[k];//	这里写成H.x += dy1[k];比赛的时候就悲剧了
if(H.x >= 0 && H.x < n && H.y >= 0 && H.y < m)
{
if(map[H.x][H.y] == 'A' && !M.fa)
{
M.dam += 1;
M.fa = true;

}

if(map[H.x][H.y] == 'D' && !M.fd)
{
M.dam += 4;
M.fd = true;
}

if(map[H.x][H.y] == 'B' && !M.fb)
{
M.dam += 2;
M.fb = true;
}
for(int t = 0 ; t < 4; t++)
{
O = H;
O.x += dx1[t];
O.y += dy1[t];
if(O.x >= 0 && O.x < n && O.y >= 0 && O.y < m)
{
if(map[O.x][O.y] == 'B' && !M.fb)
{
M.dam += 2;
M.fb = true;
}
}

}
}

}
}

}
//printf(");
/*
if(M.x >= 0 && M.x < n && M.y >= 0 && M.y < m && map[M.x][M.y] == '!')
{
printf("Case %d: %d/n", T, M.dam);
return true;
}
*/
Q.push(M);

}
// 这里越改越错本来的想法是OK的, 可是后来wrong 这怀疑自己的算法了
//			P.fa = M.fa;
//			P.fb = M.fb;
//			P.fc = M.fc;
//			P.fd = M.fd;
//			P.fe = M.fe;
}

}
return false;

}
int main()
{
int tt;

scanf("%d", &tt);
for(T = 1; T <= tt; T++)
{
int n, m;
scanf("%d %d", &n ,&m);
for(int i = 0; i < n; i++)
{

scanf("%s", map[i]);
for(int j = 0; j < m; j++)
{
if(map[i][j] == '$')
{
sx = i;
sy = j;
}
if(map[i][j] == '!')
{
ex = i;
ey = j;
}
}

}
if(!BFS(n, m))
{
fprintf(stdout, "Case %d: -1/n", T);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  distance 算法 struct input c