54求调,玄关
查看原帖
54求调,玄关
1311900
Greeper楼主2024/11/23 10:06
#include<bits/stdc++.h>
using namespace std;
char mp[305][305];
int n,m;
int f[305][305],fg[305][305];
int gx[5]={0,1,0,-1,0},gy[5]={0,0,1,0,-1};
bool flag;
int bfs()
{
    queue<int> x;
    queue<int> y;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(mp[i][j]=='@')
                x.push(i),y.push(j);
    while(!x.empty())
	{
        int nx=x.front(),ny=y.front();
        x.pop();y.pop();
        for(int i=1;i<=4;i++)
        {
            int tx=nx+gx[i],ty=ny+gy[i];
            if(tx>=1&&tx<=n&&ty>=1&&ty<=m)
            {
            	flag=0;
            	if(mp[nx][ny]>='A'&&mp[nx][ny]<='Z')
					flag=1;
            	if(mp[tx][ty]=='#')continue;
                if(mp[tx][ty]=='.'&&!f[tx][ty])
                {
                    f[tx][ty]=(flag?fg[nx][ny]+1:f[nx][ny]+1);
                    x.push(tx);y.push(ty);
                }
                if(mp[tx][ty]=='=')
                {
                	f[tx][ty]=(flag?fg[nx][ny]+1:f[nx][ny]+1);
                    return f[nx][ny]+1;
                }
                if(mp[tx][ty]>='A'&&mp[tx][ty]<='Z'&&!f[tx][ty])
                {
                	char c=mp[tx][ty];
					f[tx][ty]=(flag?fg[nx][ny]+1:f[nx][ny]+1);
                	for(int i=1;i<=n;i++)
                	{
            			for(int j=1;j<=n;j++)
            			{
            				if(mp[i][j]==c&&(i!=tx||j!=ty))
            				{
            					fg[i][j]=f[nx][ny]+1;
            					x.push(i);y.push(j);
            				}
    					}
            		}
    			}
            }
        }
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>mp[i][j];
    cout<<bfs()<<endl;
    return 0;
}
/*
7 7
###=###
#.....#
###A###
#.....#
#@#####
###A..#
#######
*/
2024/11/23 10:06
加载中...