这个题目我就不说,链接在这里http://acm.hdu.edu.cn/showproblem.php?pid=1254
主要我想说的是,一开始是我用2个三围数组来分别标记人和箱子走过的四个方向,但不知怎么回事行不通。。。
于是就用一个四维数组来标记状态,嘻嘻,过了。。。
好吧,还是直接上代码了。。。。
1 #include2 #include 3 #include 4 5 using namespace std; 6 int visited[8][8][8][8];//记录人和箱子的状态 7 int map[8][8]; 8 int dir[4][2]={ {-1,0},{ 1,0},{ 0,-1},{ 0,1}};//上、下、左、右 9 int m,n;10 int px,py,sx,sy,ex,ey;11 12 struct point {13 int x,y; //人的位置14 int bx,by; //箱子的位置15 int step;16 bool operator <(const point &p) const {17 return p.step Q; 23 point s;24 s.x=x,s.y=y,s.bx=sx,s.by=sy,s.step=0;25 Q.push(s);26 while(!Q.empty()){27 point p;28 p=Q.top();29 Q.pop();30 if(p.bx==ex&&p.by==ey){31 printf("%d\n",p.step);32 return ;33 }34 for(int i=0;i<4;i++){35 point q;36 q.x=p.x+dir[i][0];37 q.y=p.y+dir[i][1];38 q.bx=p.bx;39 q.by=p.by;40 q.step=p.step;41 if(q.x<0||q.x>=m||q.y<0||q.y>=n)42 continue;43 if(map[q.x][q.y]==1||visited[q.x][q.y][q.bx][q.by])44 continue;45 //如果找到了箱子,此时要推的方向与人的方向一致46 if(q.x==q.bx&&q.y==q.by){47 q.bx=p.bx+dir[i][0];48 q.by=p.by+dir[i][1];49 q.step+=1;50 if(q.bx<0||q.bx>=m||q.by<0||q.by>=n)51 continue;52 if(visited[q.x][q.y][q.bx][q.by]||map[q.bx][q.by]==1)53 continue;54 visited[q.x][q.y][q.bx][q.by]=1;55 }56 Q.push(q);57 visited[q.x][q.y][q.bx][q.by]=1;58 }59 }60 printf("-1\n");61 }62 63 64 int main(){65 int t;66 scanf("%d",&t);67 while(t--){68 scanf("%d%d",&m,&n);69 for(int i=0;i