HDU 1732 push Box

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

这是HDU1254的加强版,但是这里和那里的区别再去 这里是以人的意志为转移,那么设计状态的就要考虑人是主体了。。8维hash。。AC。。BFS 。。。这里hash的是不要开成int的,不然会MLE。。。记住,,开hash的时候一般不要int,开bool的或者char这空间会减少四倍。。

代码:

#include<iostream> #include<queue> using namespace std ; const int Inf = 1<<30 ; char map[10][10] ; int dx[] = {0,-1,0,1} ; int dy[] = {-1,0,1,0} ; int n,m,cnt,maxl; bool hash[8][8][8][8][8][8][8][8] ; struct Node { int x,y; }; struct state { Node hum,box[4]; int step; bool isok() { if(hum.x<0||hum.x>=n||hum.y<0||hum.y>=m||map[hum.x][hum.y]=='#') return false ; return true ; } }start,cur,next; void sethash(state cur) { hash[cur.hum.x][cur.hum.y][cur.box[0].x][cur.box[0].y][cur.box[1].x][cur.box[1].y][cur.box[2].x][cur.box[2].y] = true ; } bool gethash(state cur) { return hash[cur.hum.x][cur.hum.y][cur.box[0].x][cur.box[0].y][cur.box[1].x][cur.box[1].y][cur.box[2].x][cur.box[2].y] ; } bool find(state cur) { if(map[cur.box[0].x][cur.box[0].y]=='@'&&map[cur.box[1].x][cur.box[1].y]=='@'&&map[cur.box[2].x][cur.box[2].y]=='@') return true ; return false ; } int isbox(state cur) { for(int i=0;i<3;i++) if(cur.hum.x==cur.box[i].x && cur.hum.y==cur.box[i].y) return i ; return -1 ; } bool logic(state cur,int dir,int which) { int x = cur.hum.x + dx[dir] ; int y = cur.hum.y + dy[dir] ; if(x<0||x>=n||y<0||y>=m||map[x][y]=='#') return false ; for(int i=0;i<3;i++) if(i!=which&&x==cur.box[i].x&&y==cur.box[i].y) return false; return true ; } queue<state>q; void bfs() { while(!q.empty()) { cur = q.front() ; q.pop() ; if(find(cur)) { maxl = cur.step ; return ; } for(int i=0;i<4;i++) { next = cur ; next.hum.x += dx[i] ; next.hum.y += dy[i] ; next.step ++ ; if(next.isok()) { int which = isbox(next) ; if(which!=-1) { if(logic(next,i,which)) { next.box[which].x += dx[i] ; next.box[which].y += dy[i] ; if(!gethash(next)) { sethash(next); q.push(next) ; } } } else { if(!gethash(next)) { sethash(next); q.push(next) ; } } } } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { cnt = 0 ; for(int i=0;i<n;i++) { scanf("%s",&map[i]) ; for(int j=0;j<m;j++) { if(map[i][j]=='X') { start.hum.x = i , start.hum.y = j ; } else if(map[i][j]=='*') { start.box[cnt].x = i , start.box[cnt++].y = j ; } } } start.step = 0 ; memset(hash,false,sizeof(hash)); sethash(start); while(!q.empty()) q.pop() ; q.push(start); maxl = Inf ; bfs() ; printf("%d/n",(maxl==Inf)?-1:maxl); } return 0 ; }   

 

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