CF1503B 3-Coloring

首先很容易看出来如果对于一个未填颜色的格子,它的上下左右任意两个点的颜色不一样,那么必输

就是类似以上这种情况,c1,c2为两个不同的颜色,?是未填充的颜色

所以填充颜色的时候一定要避免出现这种情况

首先在(1,1)处填充第一个格子,设alice选择的颜色为d,那么记c1,c2是不等于d的两个颜色,c3=d,然后在(1,1)处填上c1

那么怎么样才能避免上述的情况呢,这时候就联想到了棋盘格

(以3*3为例)

最开始我们才(1,1)处填上了c1,那么在接下来的操作中,如果可以选c1颜色,那么就在阴影格子上填c1,如果可以选择c2,那么就在白色格子上填c2

这样填可以保证不会出现一个未填颜色的格子的相邻的两个格子颜色不一样的情况

但是这样就忽略一种情况:

下一步alice选择c1,c3的话,还可以在白色格子填c2,要是选择c2呢

很显然就在白色格子上填c3就好了,因为这种情况下对于任意一个未填颜色的格子,它的上下左右都是一个颜色,在白色格子随便填c2,c3都不会影响结果

这种情况与上述同理

考场上差点就A了这道题了,结果自己思维混乱没想明白后面的情况,然后不幸地掉分了

我都快怀疑我受到了div2只能A三道题的诅咒(或者只是自己单纯的菜)

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define db double
#define rep(x,a,b) for(int x=(a);x<=(b);x++)
#define per(x,a,b) for(int x=(a);x>=(b);x--)
#define reP(x,a,b) for(int x=(a);x<(b);x++)
#define Per(x,a,b) for(int x=(a);x>(b);x--)
#define scf(a) scanf("%d",&a)
#define scfll(a) scanf("%lld",&a)
#define scfdb(a) scanf("%lf",&a)
#define ptf(a) printf("%d",a)
#define ptfll(a) printf("%lld",a)
#define ptfdb(x,a) printf("%x.lf",a)
#define ptfsp(a) printf("%d ",a)
#define ptfllsp(a) printf("%lld ",a)
#define ptfdbsp(x,a) printf("%x.lf ",a)
#define pli(a,b) make_pair(a,b)
#define pb push_back
#define el puts("")
#define ls pos<<1
#define rs pos<<1|1
#define pi 3.1415926
//ios::sync_with_stdio(false);
using namespace std;
const ll mod=1e9+7;
const int maxn=3e5+5;
pair<int,int>p0[maxn],p1[maxn];
int a[105][105];
int main(){
    int n;scf(n);
    int cnt0=0,cnt1=0;
    rep(i,1,n){
        rep(j,1,n){
            if(i==1&&j==1) continue;
            if((i+j)%2) p1[++cnt1]=pli(i,j);
            else p0[++cnt0]=pli(i,j);
        }
    }

    int col1,col2,col3;
    int i0=0,i1=0;
    rep(o,1,n*n){
        int d;scf(d);
        if(o==1){
            if(d==1) col1=2,col2=3,col3=1;
            if(d==2) col1=1,col2=3,col3=2;
            if(d==3) col1=1,col2=2,col3=3;
            printf("%d %d %d\n",col1,1,1);
            fflush(stdout);
        }
        else{
            if(i0==cnt0&&i1!=cnt1){
                i1++;
                if(d==col1) printf("%d %d %d\n",col2,p1[i1].first,p1[i1].second),fflush(stdout);
                else if(d==col2) printf("%d %d %d\n",col3,p1[i1].first,p1[i1].second),fflush(stdout);
                else printf("%d %d %d\n",col2,p1[i1].first,p1[i1].second),fflush(stdout);
            }
            else if(i1==cnt1&&i0!=cnt0){
                i0++;
                if(d==col2) printf("%d %d %d\n",col1,p0[i0].first,p0[i0].second),fflush(stdout);
                else if(d==col1) printf("%d %d %d\n",col3,p0[i0].first,p0[i0].second),fflush(stdout);
                else printf("%d %d %d\n",col1,p0[i0].first,p0[i0].second),fflush(stdout);
            }
            else{
                if(d==col1) {i1++;printf("%d %d %d\n",col2,p1[i1].first,p1[i1].second),fflush(stdout);}
                else {i0++;printf("%d %d %d\n",col1,p0[i0].first,p0[i0].second),fflush(stdout);}
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/ghu99999/article/details/115427979