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);}
            }
        }
    }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值