地址:
点击打开链接
主要是需要考虑,箱子可以到,人是不是也可以到推箱子的位置。
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<queue> #include<string.h> using namespace std; int T,m,n; int Map[10][10]; int flagBox[10][10][4]; int flagPerson[10][10]; int targetX ,targetY ; int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}}; struct Node{ int x ; int y ; int step ; int mmap[10][10]; bool check() { if(x<0||x>=m||y<0||y>=n) return false ; return true ; } }BoxStart,PersonStart,target; bool bfs_person(Node n1){ queue<Node> que ; PersonStart = n1 ; Node b ; for(int i = 0 ; i < m ; i ++) { for(int j = 0 ; j < n ; j ++) { if(n1.mmap[i][j]==4) { PersonStart.x = i ; PersonStart.y = j ; PersonStart.step = 0 ; } } } memset(flagPerson,0,sizeof(flagPerson)); flagPerson[PersonStart.x][PersonStart.y]=1; if(PersonStart.x == target.x&&PersonStart.y==target.y) return true ; que.push(PersonStart); while(!que.empty()) { Node a = que.front(); que.pop(); for(int i = 0 ; i < 4 ; i ++) { b = a ; b.step ++ ; b.x +=dir[i][0]; b.y +=dir[i][1]; if(!b.check()||b.mmap[b.x][b.y]==1||b.mmap[b.x][b.y]==2||flagPerson[b.x][b.y]) continue ; flagPerson[b.x][b.y]=1; if(b.x == target.x&&b.y==target.y) { return true ; } que.push(b); } } return false ; } int BFS(){ memset(flagBox,0,sizeof(flagBox)); queue<Node> temp ; Node s,t ; temp.push(BoxStart); while(!temp.empty()) { s = temp.front(); temp.pop(); for(int i =0 ; i < 4 ; i ++) { t = s ; t.x+=dir[i][0]; t.y+=dir[i][1]; t.step++; if(!t.check()||Map[t.x][t.y]==1||flagBox[t.x][t.y][i]) continue ; target.x = s.x-dir[i][0]; target.y = s.y-dir[i][1]; if(!target.check()) continue ; if(bfs_person(t)) { // cout <<" " <<target.x <<" " << target.y << " " << endl; swap(t.mmap[s.x][s.y],t.mmap[t.x][t.y]); swap(t.mmap[PersonStart.x][PersonStart.y],t.mmap[target.x][target.y]); // cout <<t.x << " " << t.y <<" " <<t.step <<endl; flagBox[t.x][t.y][i]=1; if(Map[t.x][t.y]==3) return t.step; temp.push(t); } } } return -1 ; } int main(){ int i , j ; scanf("%d",&T); while(T--) { scanf("%d%d",&m,&n); for(i = 0 ; i < m; i ++) { for(j = 0 ; j < n ; j ++) { scanf("%d",&Map[i][j]); BoxStart.mmap[i][j] = Map[i][j] ; if(Map[i][j]==2) { BoxStart.x = i ; BoxStart.y = j ; BoxStart.step = 0 ; } } } cout << BFS()<<endl ; } return 0 ; }