D. 3-Coloring(思维+构造)

https://codeforces.com/contest/1504/problem/D


思路:

类似黑白染色。

如果给1,那么2和3空闲。优先把2放到棋盘的(i+j)的偶位。如果2满了,那就放3,注意此时3的位置其实是占了本该给1的位置的。

如果给2,那么1和3空闲。优先把1放到棋盘的(i+j)的奇位。如果1满了,那就放3,注意此时3的位置其实是占了本该给2的位置的。

如果给3,那么1和2空闲,如果1还可以放,放1,如果1不能放了,放2,2不能放了。结束。

关于交互题的输出问题。endl直接就可以了。如果还存在Idleness limit exceeded on test 。说明是由于程序问题,导致多询问了,或者多输出了怎么样。当时判棋盘的黑白块数量的时候没有/2导致一直这个问题。

注意棋盘的奇数的时候有一个块数量+1

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=120;
typedef int LL;
inline LL read(){LL x=0,f=1;char ch=getchar();	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;}
LL a[maxn][maxn];
LL n;
LL cnt1=0,cnt2=0;
LL get(){
   LL col;cin>>col;
   return col;
}
void solve1(LL col){
    if(col==1){
        for(LL j=1;j<=n;j++){
              for(LL k=1;k<=n;k++){
                 if(!a[j][k]&&((j+k)%2==0)){
                    a[j][k]=1;cnt1++;
                    cout<<col<<" "<<j<<" "<<k<<endl;
                    return;
                 }
              }
        }
    }
    else if(col==2){
        for(LL j=1;j<=n;j++){
            for(LL k=1;k<=n;k++){
                if(!a[j][k]&& ( (j+k)&1)){
                    a[j][k]=2;cnt2++;
                    cout<<col<<" "<<j<<" "<<k<<endl;
                    return;
                }
            }
        }
    }
    else if(col==3){
        for(LL j=1;j<=n;j++){
            for(LL k=1;k<=n;k++){
                if(!a[j][k]){
                    a[j][k]=3;
                    cout<<col<<" "<<j<<" "<<k<<endl;
                    return;
                }
            }
        }
    }
}
int main(void){
    cin>>n;
    for(LL i=1;i<=n*n;i++){
        LL col=get();
        LL temp1=n*n/2-cnt1;
        if(n&1) temp1++;
        LL temp2=n*n/2-cnt2;
        if(col==3){
           if(temp1){
              solve1(1);
           }
           else if(temp2){
              solve1(2);
           }
           else solve1(3);
        }
        if(col==1){
            if(temp2){
                solve1(2);
            }
            else{
                cnt1++;solve1(3);
            }
        }
        if(col==2){
            if(temp1){
                solve1(1);
            }
            else{
                cnt2++;solve1(3);
            }
        }
   }
   return 0;
}

猜你喜欢

转载自blog.csdn.net/zstuyyyyccccbbbb/article/details/115430358