#include<bits/stdc++.h>
using namespace std;
int t;
int m,n;
int g[9][9];
int s[9][9][9][9];bool vis[9][9];
int vx[]={0,0,1,-1};int vy[]={-1,1,0,0};
signed main(){
cin>>t;
while(t--){
cin>>m>>n;
int sx,sy,bx,by,ex,ey;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>g[i][j];
if(g[i][j]==2) bx=i,by=j;
//cout<<11111111111111<<endl;
if(g[i][j]==3) ex=i,ey=j;
if(g[i][j]==4) sx=i,sy=j;
}
}fill(vis[0],vis[0]+9*9,0);
fill(s[0][0][0],s[0][0][0]+9*9*9*9,INT_MAX);
deque<int> q;
int ax,ay;
s[sx][sy][bx][by]=0;
g[sx][sy]=1;
//cout<<sx<<sy<<endl;
q.push_back(sx);
q.push_back(sy);
q.push_back(bx);
q.push_back(by);
while(!q.empty()){
int x=q.front();
q.pop_front();
int y=q.front();
q.pop_front();
int u=q.front();
q.pop_front();
int v=q.front();
q.pop_front();
if(u==sx && v==sy){
ax=x;ay=y;
break;
}
//if(vis[x][y]) continue;
for(int i=0;i<4;i++){
int nx=vx[i]+x;
int ny=vy[i]+y;
if(nx<1 || nx>n) continue;
if(ny<1 || ny>m) continue;
//if(s[nx][ny][u][v]!=INT_MAX) continue;
//if(vis[u][v]) continue;
if(g[nx][ny]==1) continue;
//vis[u][v]=1;
//cout<<nx<<' '<<ny<<endl;
if(nx==u && ny==v){;
int nu=u+vx[i];
int nv=v+vy[i];cout<<x<<' '<<y<<' '<<nx<<' '<<ny<<' '<<nu<<' '<<nv<<endl;
if(nu<1 || nu>n) continue;
if(nv<1 || nv>m) continue;
if(g[nu][nv]==1) continue;
if(s[nx][ny][nu][nv]!=INT_MAX) continue;
q.push_back(nx);
q.push_back(ny);
q.push_back(nu);
q.push_back(nv);
s[nx][ny][u][v]=s[x][y][nu][nv]+1;
}
else{
if(s[nx][ny][u][v]!=INT_MAX) continue;
q.push_front(u);
q.push_front(v);
q.push_front(nx);
q.push_front(ny);
s[nx][ny][u][v]=s[x][y][u][v];
}
}
}
cout<<s[ax][ay][ex][ey]<<endl;
}
return 0;
}
2 个赞
#include<bits/stdc++.h>
using namespace std;
int n,m,Map[10][10];
int book[10][10][10][10];
int dir[4][2]={0,1,1,0,0,-1,-1,0};
struct node{
int sx,sy,ex,ey,step;
bool operator<(const node &a)const{
return a.step<step;
}
};
int check(int x,int y){
if(x<1||x>n||y<1||y>m||Map[x][y]==1)
return 1;
return 0;
}
void bfs(int x1,int y1,int x2,int y2){
memset(book,0,sizeof(book));
priority_queue<node>Q;
node p,q;
q.sx=x1,q.sy=y1,q.ex=x2,q.ey=y2,q.step=0;
Q.push(q);
book[x1][y1][x2][y2]=1;
while(!Q.empty()){
p=Q.top();
Q.pop();
if(Map[p.ex][p.ey]==3){
printf("%d\n",p.step);
return;
}
for(int i=0; i<4; i++){
q.sx=p.sx+dir[i][0];
q.sy=p.sy+dir[i][1];
if(check(q.sx,q.sy))continue;
q.ex=p.ex,q.ey=p.ey,q.step=p.step;
if(q.sx==q.ex&&q.sy==q.ey){
q.ex=p.ex+dir[i][0];
q.ey=p.ey+dir[i][1];
if(check(q.ex,q.ey))continue;
q.step++;
}
if(!book[q.sx][q.sy][q.ex][q.ey]){
book[q.sx][q.sy][q.ex][q.ey]=1;
Q.push(q);
}
}
}
printf("-1\n");
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
int x1,y1,x2,y2,x3,y3;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&Map[i][j]);
if(Map[i][j]==4)x1=i,y1=j;
else if(Map[i][j]==3)x2=i,y2=j;
else if(Map[i][j]==2)x3=i,y3=j;
}
}
bfs(x1,y1,x3,y3);
}
}
2 个赞
我推荐你使用如下代码:(先搜人能到的地方,再搜箱子)
易于理解
#include<bits/stdc++.h>
using namespace std;
bool dt[10][10],v[10][10]={0},vren[10][10]={0};
int n,m,sx,sy,ex,ey,rx,ry,k,t;
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
void dfsren(int x,int y){
vren[x][y]=1;
for(int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx<1||nx>n||ny<1||ny>m) continue;
if(dt[nx][ny]==1||vren[nx][ny]==1) continue;
dfsren(nx,ny);
}
return;
}
struct xx{
int x,y,step;
};
void bfs(){
queue<xx> q;
q.push(xx{sx,sy,0});
while(q.size()>0){
xx now=q.front();
q.pop();
if(now.x==ex&&now.y==ey){
printf("%d\n",now.step);
return;
}
for(int i=0;i<4;i++){
int nx=now.x+dx[i],ny=now.y+dy[i];
if(nx<1||nx>n||ny<1||ny>m) continue;
if(dt[nx][ny]==1||v[nx][ny]==1) continue;
if(vren[now.x-dx[i]][now.y-dy[i]]==0) continue;//如果人不能到推箱子的反方向就跳过
v[nx][ny]=1;
q.push(xx{nx,ny,now.step+1});
}
}
printf("%d\n",-1);
return;
}
int main(){
cin>>t;
while(t--){
for(int i=0;i<=10;i++){
for(int j=0;j<=10;j++){
vren[i][j]=0;
v[i][j]=0;
}
}
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&k);
if(k==1) dt[i][j]=1;
else dt[i][j]=0;
if(k==2){
sx=i;
sy=j;
}else if(k==3){
ex=i;
ey=j;
}else{
rx=i;
ry=j;
}
}
}
dfsren(rx,ry);
bfs();
}
return 0;
}
2 个赞