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