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; }
相关文章推荐
- [ACM_HDU_2037]今年暑假不AC(贪心算法)
- HDU 3442 Three Kingdoms(状态压缩 + BFS )
- HDU 3442 Three Kingdoms
- ACM刷题之HDU————今年暑假不AC
- 确定比赛名次(http://acm.hdu.edu.cn/showproblem.php?pid=1285)
- hdu--3442 Three Kingdoms(bfs+优先队列)
- [ACM] hdu 1285 确定比赛名次 (拓扑排序)
- hdu 3442 Three Kingdoms
- CSU-ACM2017暑假集训比赛8 - E - Escape - HDU - 3605
- HDU ACMSteps 1.3.2:: 今年暑假不AC(动态规划)
- hdu 3442 Three Kingdoms 优先级队列+BFS
- HDU_ACM-2037 今年暑假不AC
- ACM_HDU_2037_今年暑假不AC
- [ACM] hdu 1285 确定比赛名次 (拓扑排序)
- [ACM] hdu 1285 确定比赛 (拓扑排序)
- CSU-ACM2017暑假集训比赛7 - E - Courses - HDU - 1083
- HDU 3442 Three Kingdoms 优先队列(非状压做法)
- CSU-ACM2017暑假集训比赛8 - A - Xor Sum - HDU - 4825
- 【BFS+优先队列】HDU 3442 Three Kingdoms
- 【ACM】Fighting for HDU