CF1503 B. 3-Coloring 构造

题解:采用类似国际象棋网格的形式构造数的填法。假设将棋盘分为黑白色,尝试用1填满白色区域,2填满黑色区域,在两种颜色都未填满时,输入1,2,3时优先用1,2填满对应颜色。当其中一种颜色填满时,用剩余的颜色填完棋盘的剩余区域。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int ma[200][200];
int n,flag=0;
void out(int op,int x,int y)
{
    
    
    cout<<op<<' '<<x<<' '<<y<<endl;
    cout.flush();
}
void check(int op)
{
    
    
    int ok=0;
    if(op==2)
    {
    
    
        for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
        {
    
    
            if((i+j)%2==1 && ma[i][j]==0)ok=1;
        }
    }
    else 
    {
    
    
        for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
        {
    
    
            if((i+j)%2==0 && ma[i][j]==0)ok=1;
        }
    }
    if(!ok && op==2)flag=2;
    if(!ok && op==1)flag=1;
}
int main()
{
    
    
    cin>>n;
    for(int k=1;k<=n*n;k++)
    {
    
    
        int op;
        cin>>op;
        int ok=0;
        if(op==1)
        {
    
    
            if(!flag)
            {
    
    
                for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
                {
    
    
                    if(ok)break;
                    if((i+j)%2==1 && ma[i][j]==0)
                    {
    
    
                        ma[i][j]=2;
                        out(2,i,j);
                        ok=1;
                    }
                }
                check(2);
            }
            else 
            {
    
    
                for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){
    
    
                    if(ok)break;
                    if(flag==2 && (i+j)%2==0 && ma[i][j]==0)
                    {
    
    
                        ma[i][j]=3;
                        out(3,i,j);
                        ok=1;
                    }
                    if(flag==1 && (i+j)%2==1 && ma[i][j]==0)
                    {
    
    
                        ma[i][j]=3;
                        out(3,i,j);
                        ok=1;
                    }
                }
            }
        }
        else if(op==2)
        {
    
    
            if(!flag)
            {
    
    
                for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
                {
    
    
                    if(ok)break;
                    if((i+j)%2==0 && ma[i][j]==0)
                    {
    
    
                        ma[i][j]=1;
                        out(1,i,j);
                        ok=1;
                    }
                }
                check(1);
            }
            else 
            {
    
    
                for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){
    
    
                    if(ok)break;
                    if(flag==2 && (i+j)%2==0 && ma[i][j]==0)
                    {
    
    
                        ma[i][j]=3;
                        out(3,i,j);
                        ok=1;
                    }
                    if(flag==1 && (i+j)%2==1 && ma[i][j]==0)
                    {
    
    
                        ma[i][j]=3;
                        out(3,i,j);
                        ok=1;
                    }
                }
            }
        }
        else
        {
    
    
            if(flag==0){
    
    
                for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
                {
    
    
                    if(ok)break;
                    if((i+j)%2==1 && ma[i][j]==0)
                    {
    
    
                        ma[i][j]=2;
                        out(2,i,j);
                        ok=1;
                    }
                }
                check(2);
            }
            else if(flag==2)
            {
    
    
                for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
                {
    
    
                    if(ok)break;
                    if((i+j)%2==0 && ma[i][j]==0)
                    {
    
    
                        ma[i][j]=1;
                        out(1,i,j);
                        ok=1;
                    }
                }
            }
            else 
            {
    
    
                for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
                {
    
    
                    if(ok)break;
                    if((i+j)%2==1 && ma[i][j]==0)
                    {
    
    
                        ma[i][j]=2;
                        out(2,i,j);
                        ok=1;
                    }
                }
            }
        }
        
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Ambrumf/article/details/122269505