返回顶部

Codeforces Round #712 (Div. 2) D. 3-Coloring (交互,构造)

  • 题意:有一个\(n\)x\(n\)的空矩阵,有三种颜色,Alice每次给你一种颜色,你需要选择另外两种颜色填某一个空格子,不能出现相邻格子同一种颜色,交互题,Alice会根据你的决定来出最优的情况,每次输出颜色和单位.

  • 题解:我们用两个栈将不相邻的格子存起来,栈1用来涂颜色1(Alice选颜色2的时候),栈2用来涂颜色2(Alice选1和3的时候),这样的话会有某个栈用完的情况,这时我们就要用剩下那一个栈来涂,但是剩下的栈不能涂用完的那个栈涂的颜色,跑几个if就可以了.

  • 代码:

    #include <bits/stdc++.h>
    #define ll long long
    #define fi first
    #define se second
    #define pb push_back
    #define me memset
    #define rep(a,b,c) for(int a=b;a<=c;++a)
    #define per(a,b,c) for(int a=b;a>=c;--a)
    const int N = 1e6 + 10;
    const int mod = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    typedef pair<int,int> PII;
    typedef pair<ll,ll> PLL;
    ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
    ll lcm(ll a,ll b) {return a/gcd(a,b)*b;}
     
     
     
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    	int n,x;
    	cin>>n;
    	vector<PII> stk1(n*n+10),stk2(n*n+10);
    	int cnt1=0,cnt2=0;
    	rep(i,1,n){
    		rep(j,1,n){
    			if((i+j)&1) stk1[++cnt1]={i,j};
    			else stk2[++cnt2]={i,j};
    		}
    	}
     
    	rep(i,1,n*n){
    		cin>>x;
    	
    		if(cnt1==0 || cnt2==0){
    			if(cnt1==0){
    				auto it=stk2[cnt2--];
    				if(x==2){
    					cout<<3<<' '<<it.fi<<' '<<it.se<<'\n';
    				}
    				else{
    					cout<<2<<' '<<it.fi<<' '<<it.se<<'\n';
    				}
    				cout.flush();
    			}
    			else{
    				auto it=stk1[cnt1--];
    				if(x==1){
    					cout<<3<<' '<<it.fi<<' '<<it.se<<'\n';
    				}
    				else{
    					cout<<1<<' '<<it.fi<<' '<<it.se<<'\n';
    				}
    				cout.flush();
    			}
     
    		}
    		else{
    			if(x==2){
    				auto it=stk1[cnt1--];
    				cout<<1<<' '<<it.fi<<' '<<it.se<<'\n';
    			}
    			else{
    				auto it=stk2[cnt2--];
    				cout<<2<<' '<<it.fi<<' '<<it.se<<'\n';
    			}
    			cout.flush();
    		}
     
    	}
    	
        return 0;
    }
    
posted @ 2021-04-16 09:54  Rayotaku  阅读(49)  评论(0编辑  收藏  举报