萌新求助,120行,WA 18。
查看原帖
萌新求助,120行,WA 18。
286448
Eason2009楼主2022/10/22 12:47
#include<bits/stdc++.h>
#define QwQ cout<<"QwQ"<<endl
using namespace std;
typedef pair<int,int> pii;
const int N=20,M=55;
const int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
int n,r,c,dis[N][N],dp[1<<(N-4)+5][N],vis[M][M],bel[M][M],inf=0x3f3f3f3f,ans=inf;
char mp[M][M];
vector<pii>island[N];
int main()
{
	memset(dis,0x3f,sizeof(dis));
	memset(dp,0x3f,sizeof(dp));
	cin>>r>>c;
	for(int i=1;i<=r;i++)
	{
		for(int j=1;j<=c;j++)
		{
			cin>>mp[i][j];
		}
	}
	for(int i=1;i<=r;i++)
	{
		for(int j=1;j<=c;j++)
		{
			if(!vis[i][j]&&mp[i][j]=='X')
			{
				queue<pii>q;
				q.push(make_pair(i,j));
				while(!q.empty())
				{
					int x=q.front().first,y=q.front().second;
					q.pop();
					vis[x][y]=1;
					bel[x][y]=n;
					island[n].push_back(make_pair(x,y));
					for(int k=0;k<4;k++)
					{
						int xx=x+dx[k],yy=y+dy[k];
						if(xx>=1&&xx<=r&&yy>=1&&yy<=c&&!vis[xx][yy]&&mp[xx][yy]=='X')
						{
							q.push(make_pair(xx,yy));
						}
					}
				}
				n++;
			}
		}
	}
	for(int i=0;i<n;i++)
	{
		memset(vis,-1,sizeof(vis));
		queue<pii>q;
		for(int j=0;j<island[i].size();j++)
		{
			pii u=island[i][j];
			q.push(u);
			vis[u.first][u.second]=0;
		}
		dis[i][i]=0;
		while(!q.empty())
		{
			int x=q.front().first,y=q.front().second;
			q.pop();
			for(int k=0;k<4;k++)
			{
				int xx=x+dx[k],yy=y+dy[k];
				if(xx>=1&&xx<=r&&yy>=1&&yy<=c&&vis[xx][yy]==-1)
				{
					vis[xx][yy]=vis[x][y]+1;
					if(mp[xx][yy]=='X')
					{
						int j=bel[xx][yy];
						dis[i][j]=min(dis[i][j],vis[x][y]);
					}
					if(mp[xx][yy]=='S')
					{
						q.push(make_pair(xx,yy));
					}
				}
			}
		}
	}
	for(int k=0;k<n;k++)
	{
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
			}
		}
	}
	for(int i=0;i<n;i++)
	{
		dp[i][1<<i]=0;
	}
	for(int i=1;i<(1<<n);i++)
	{
		for(int j=0;j<n;j++)
		{
			if((1<<j)&i)
			{
				for(int k=0;k<n;k++)
				{
					if(!((1<<k)&i))
					{
						dp[k][i|(1<<k)]=min(dp[k][i|(1<<k)],dp[j][i]+dis[j][k]);
					}
				}
			}
		}
	}
	for(int i=0;i<n;i++)
	{
		ans=min(ans,dp[i][(1<<n)-1]);
	}
	cout<<ans;
	return 0;
}
2022/10/22 12:47
加载中...