HDU 2128 Tempter of the Bone II

http://acm.hdu.edu.cn/showproblem.php?pid=2128

题意:简洁。。不在累述了。。

设计状态:hash[x][y][bomb]到每一个点剩下多少bomb,然后保存每一张图,对于图这里可以用位压缩保存,因为矩阵最大也就是8*8,刚好是2^64方,可以用__int64保存,但是要注意的是每个炸弹或者墙被炸掉后就成了空地。所以保存只是保存走过的墙和炸弹,还有一个地方值得注意啊,就是取走的炸弹的点,可以以后再走,不是以后不能走,但是不能再去炸弹了而已。。。。这里贡献了 很多次wa。。。

然后BFS。。。。。。

#include<iostream> #include<queue> using namespace std ; char map[10][10] ; int n,m,maxl,ex,ey,hash[10][10][650] ; int dx[5] = {1,-1,0,0}; int dy[5] = {0,0,1,-1}; struct state { int x,y,bomb,st; bool wall[10][10],exp[10][10]; bool logic() //这里可以用 __int64 位压缩 存储 图 { if(x>=0&&x<n&&y>=0&&y<m) return true ; return false ; } }start,cur,next; queue<state>q; void bfs() { while(!q.empty()) { cur = q.front() ; q.pop() ; if(cur.x==ex && cur.y==ey) { maxl = cur.st ; return 0 ; } for(int i=0;i<4;i++) { next = cur ; next.x += dx[i] ; next.y += dy[i] ; next.st ++ ; if(next.logic()) { if(map[next.x][next.y]=='X' && next.wall[next.x][next.y]) { if(next.bomb>0) { next.bomb -- ; next.wall[next.x][next.y] = false ; next.st ++ ; q.push(next); hash[next.x][next.y][next.bomb] = next.st ; } } else if(map[next.x][next.y]>='1'&&map[next.x][next.y]<='9'&&!next.exp[next.x][next.y]) { //这里有些点 以前有炸弹的 但是以后还是可以再次走 下的话 就会造成不能再走了。。。 // if(!next.exp[next.x][next.y]) { next.bomb += map[next.x][next.y]-'0' ; next.exp[next.x][next.y] = true ; q.push(next) ; hash[next.x][next.y][next.bomb] = next.st ; } } else { if(hash[next.x][next.y][next.bomb]==0||hash[next.x][next.y][next.bomb] > next.st) { q.push(next); hash[next.x][next.y][next.bomb] = next.st ; } } } } } } int main() { while(scanf("%d %d",&n,&m)&&(n+m)) { memset(start.wall,false,sizeof(start.wall)) ; memset(start.exp,false,sizeof(start.exp)) ; for(int i=0;i<n;i++) scanf("%s",&map[i]); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(map[i][j]=='S') start.x = i ,start.y = j ; if(map[i][j] == 'D') ex = i , ey = j ; if(map[i][j]=='X') start.wall[i][j] = true ; } } memset(hash,0,sizeof(hash)); start.bomb = 0 , start.st = 0 ; hash[start.x][start.y][start.bomb] = 0 ; q.push(start) ; maxl = INT_MAX ; bfs(); printf("%d/n",(maxl==INT_MAX)? -1 :maxl); while(!q.empty()) q.pop() ; } return 0 ; }   

 

 

你可能感兴趣的:(struct,存储,ini)