40分求调玄关
查看原帖
40分求调玄关
1024387
xQWQx楼主2024/5/24 19:45
#include<bits/stdc++.h> 
using namespace std;
struct node{
    int x,y,ans;
    int st;
}; 
int sx,sy,ex,ey;
int n,m,v;
int dx[4]={0,1,0,-1};//方向
int dy[4]={1,0,-1,0};
bool vis[35][35][(1<<11)];
int maze[35][35];
int k[35][35][35];//锁
bool in(int x,int y){
    return 1<=x&&x<=n&&1<=y&&y<=m;
}
int BFS(){
    queue<node> Q;
    Q.push((node){sx,sy,0,0});
    vis[sx][sy][0]=1;//锁
    while(Q.size()){
        node t=Q.front();
        Q.pop();
        if(t.x==ex&&t.y==ey){
            cout<<t.ans;
            exit(0);
        }
        for(int i=0;i<4;i++){
            int nx=t.x+dx[i];
            int ny=t.y+dy[i];
            if(in(nx,ny)==0
               ||maze[nx][ny]==-1
               ||vis[nx][ny][t.st]==1) continue;//判断

            if((maze[nx][ny])!=0){
                if(((1<<(maze[nx][ny]-1))&t.st)==0) continue;
            }//有锁无钥匙

            int sum=t.st;
            for(int j=1;j<=k[nx][ny][0];j++){
                sum|=(1<<(k[nx][ny][j]-1));
            }//开锁
            vis[nx][ny][sum]=1;//锁
            Q.push((node){nx,ny,t.ans+1,sum});//入队
        }
    }
    cout<<-1;
}
int main(){
    cin>>n>>m;
    char p;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>p;
            if(p=='#') maze[i][j]=-1;//墙
            if(p=='S') sx=i,sy=j;
            if(p=='T') ex=i,ey=j;
        }
    }
    cin>>v;
    for(int i=1;i<=v;i++){
        int x,y,u,v;
        cin>>x>>y>>u>>v;
        k[x][y][0]++;//同地点数
        k[x][y][k[x][y][0]]=i;//锁的编号
        maze[u][v]=i;
    }
    BFS();
    return 0;
}

小号关

2024/5/24 19:45
加载中...