【拓扑排序】 ZOJ - 3780 Paint the Grid Again

ZOJ - 3780  Paint the Grid Again

#include <bits/stdc++.h> using namespace std; int n,m; char a[45][45]; int b[45][45],walk[4][2]= {{0,1},{0,-1},{1,0},{-1,0}}; int col[45][45],vis[1605],color; struct point { int x,y; }; vector <int> G[1605]; vector <point> s[1605]; struct node { int to,step; }; void dfs(int x,int y,int k,int f) { col[x][y]=k; for(int i=0; i<4; i++) { int xx=x+walk[i][0],yy=y+walk[i][1]; if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!col[xx][yy]&&b[xx][yy]==f) { dfs(xx,yy,k,f); } } } bool check(int x,int y) { if(x>=1&&x<=n&&y>=1&&y<=m) return 1; return 0; } int bfs(int x) { int maxx=0; memset(vis,0,sizeof vis); queue <node> q; node p; p.step=0,p.to=x; vis[x]=1; q.push(p); while(!q.empty()) { node e=q.front(); q.pop(); maxx=max(maxx,e.step); for(auto v:G[e.to]) { node ee; ee.step=e.step+1; if(!vis[v]) { vis[v]=1; ee.to=v; q.push(ee); } } } return maxx; } void print() { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) cout<<col[i][j]; cout<<endl; } } void jianbian() { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { for(int k=0;k<4;k++) { int x=i+walk[k][0],y=j+walk[k][1]; if(check(x,y)&&col[i][j]!=col[x][y]) { G[col[i][j]].push_back(col[x][y]); G[col[x][y]].push_back(col[i][j]); } } } } } int main() { int T; scanf("%d",&T); while(T--) { memset(col,0,sizeof(col)); scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) scanf("%s",a[i]+1); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(a[i][j]=='O') b[i][j]=0; else b[i][j]=1; } } color=0; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(!col[i][j]) { dfs(i,j,++color,b[i][j]); } } } jianbian(); // for(int i=1;i<=color;i++) // { // printf("%d\n",i); // for(auto x:G[i]) // { // printf("%d %d\n",i,x); // } // } int ans=1e9; for(int i=1;i<=color;i++) { int num=bfs(i); // if(num<=40) cout<<i<<" "<<num<<endl; ans=min(ans,num); } printf("%d\n",ans); for(int i=0;i<=color;i++) { G[i].clear(); // s[i].clear(); } } return 0; } /* 100 40 40 XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX */

#include <bits/stdc++.h>
using namespace std;
const int maxn=1005;
int n;
vector <int> G[maxn];
char a[505][505];
int du[maxn],vis[maxn];

void init()
{
    for(int i=1;i<=1000;i++)
        G[i].clear();
    memset(du,0,sizeof(du));
    memset(vis,0,sizeof(vis));
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        init();
        queue <int> q,ans;
        for(int i=1;i<=n;i++)
        {
            scanf("%s",a[i]+1);
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(a[i][j]=='X')
                {
                    du[i]++;
                    G[n+j].push_back(i);
                    vis[n+j]++;
                }
                else
                {
                    du[n+j]++;
                    G[i].push_back(n+j);
                    vis[i]++;
                }
            }
        }

        for(int i=1;i<=2*n;i++)
        {
            if(du[i]==0)
                q.push(i);
        }

        int tot=0;

        while(!q.empty())
        {
            int t=q.front();
            q.pop();
            tot++;
            if(vis[t]!=n) ans.push(t);
            for(auto x:G[t])
            {
                du[x]--;
                if(du[x]==0)
                    q.push(x);
            }
        }

        if(tot<2*n)
        {
            printf("No solution\n");
            continue;
        }

        int flag=0;
        while(!ans.empty())
        {
            int x=ans.front();
            ans.pop();
            if(!flag) printf("%c%d",x>n?'C':'R',x>n?x-n:x),flag=1;
            else printf(" %c%d",x>n?'C':'R',x>n?x-n:x);
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41037114/article/details/89314761