D. 3-Coloring

很有意思的交互题

给定n*n的棋盘,有三个数123可供选择填,要求是任意格子的上下左右不能和本格相同。

每次给一个数,要求本次填写不能用该数。

考虑到两个数字的符合情况的解

  1  2  1  2

  2  1  2  1

  1  2  1  2

  2  1  2  1

那么结论就是

不让我们用1,我们就填2

不让我们用2,我们就填1

不让我们用3,啊,那不用就不用嘛。

这样肯定是符合条件的,对吧。

这时候就有一个问题了 不让我们用1,我们就填2,可是2的所有位置都填满了怎么办

那就在1的位置上填3,填满的2已经帮我们阻隔了所有1位置。

同理,不让我们用2,我们就填1,1位置填满了咋办,在2的位置上填3就好了

vector<pair<int,int>>v[5];
void print(int col,pair<int,int> x){
    cout<<col<<" "<<x.first<<" "<<x.second<<endl;
}
void solve(){
    cin>>n;
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            v[(i+j)%2].push_back({i,j});
        }
    }
    for(int i=1;i<=n*n;++i){
        int x;cin>>x;
        if(x==1){
            if(v[1].size()){
                print(2,v[1].back());
                v[1].pop_back();
            }
            else{
                print(3,v[0].back());
                v[0].pop_back();
            }
        }
        else if(x==2){
            if(v[0].size()){
                print(1,v[0].back());
                v[0].pop_back();
            }
            else{
                print(3,v[1].back());
                v[1].pop_back();
            }
        }
        else{
            if(v[0].size()){
                print(1,v[0].back());
                v[0].pop_back();
            }
            else{
                print(2,v[1].back());
                v[1].pop_back();
            }
        }
    }
}
原文地址:https://www.cnblogs.com/PdrEam/p/14746739.html