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; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮