NC244909. Trial for Chief
描述
输入描述
第一行两个整数
接下来行每行个字符表示目标图形这一位是白色("W")还是黑色("B")。
输出描述
一个整数,表示最少操作次数。
示例1
输入:
3 3 WBW BWB WBW
输出:
2
示例2
输入:
2 3 BBB BWB
输出:
1
C++(clang++ 11.0.1) 解法, 执行用时: 431ms, 内存消耗: 612K, 提交时间: 2023-02-05 14:55:23
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N=55,inf=1e9; int n,m,id[N][N],tot,h[N*N],cnt,ans=inf,dis[N*N]; char c[N][N]; bool v[N*N]; struct qwe { int ne,to,va; }e[N*N*5]; void add(int u,int v,int w) { cnt++; e[cnt].ne=h[u]; e[cnt].to=v; e[cnt].va=w; h[u]=cnt; } void ins(int u,int v,int w) {//cerr<<u<<" "<<v<<" "<<w<<endl; add(u,v,w); add(v,u,w); } int spfa(int s) { for(int i=1;i<=tot;i++) dis[i]=inf; queue<int>q; v[s]=1,dis[s]=0,q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); v[u]=0; for(int i=h[u];i;i=e[i].ne) if(dis[e[i].to]>dis[u]+e[i].va) { dis[e[i].to]=dis[u]+e[i].va; if(!v[e[i].to]) { v[e[i].to]=1; q.push(e[i].to); } } } int re=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(c[i][j]=='B') re=max(re,dis[id[i][j]]); return re+1; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) id[i][j]=++tot; bool fl=0; for(int i=1;i<=n;i++) { scanf("%s",c[i]+1); for(int j=1;j<=m;j++) { if(c[i][j]=='B') fl=1; if(i!=1) ins(id[i-1][j],id[i][j],c[i-1][j]!=c[i][j]); if(j!=1) ins(id[i][j-1],id[i][j],c[i][j-1]!=c[i][j]); } } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) ans=min(ans,spfa(id[i][j])); printf("%d\n",!fl?0:ans); return 0; }