题解:采用类似国际象棋网格的形式构造数的填法。假设将棋盘分为黑白色,尝试用1填满白色区域,2填满黑色区域,在两种颜色都未填满时,输入1,2,3时优先用1,2填满对应颜色。当其中一种颜色填满时,用剩余的颜色填完棋盘的剩余区域。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int ma[200][200];
int n,flag=0;
void out(int op,int x,int y)
{
cout<<op<<' '<<x<<' '<<y<<endl;
cout.flush();
}
void check(int op)
{
int ok=0;
if(op==2)
{
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
{
if((i+j)%2==1 && ma[i][j]==0)ok=1;
}
}
else
{
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
{
if((i+j)%2==0 && ma[i][j]==0)ok=1;
}
}
if(!ok && op==2)flag=2;
if(!ok && op==1)flag=1;
}
int main()
{
cin>>n;
for(int k=1;k<=n*n;k++)
{
int op;
cin>>op;
int ok=0;
if(op==1)
{
if(!flag)
{
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
{
if(ok)break;
if((i+j)%2==1 && ma[i][j]==0)
{
ma[i][j]=2;
out(2,i,j);
ok=1;
}
}
check(2);
}
else
{
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){
if(ok)break;
if(flag==2 && (i+j)%2==0 && ma[i][j]==0)
{
ma[i][j]=3;
out(3,i,j);
ok=1;
}
if(flag==1 && (i+j)%2==1 && ma[i][j]==0)
{
ma[i][j]=3;
out(3,i,j);
ok=1;
}
}
}
}
else if(op==2)
{
if(!flag)
{
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
{
if(ok)break;
if((i+j)%2==0 && ma[i][j]==0)
{
ma[i][j]=1;
out(1,i,j);
ok=1;
}
}
check(1);
}
else
{
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){
if(ok)break;
if(flag==2 && (i+j)%2==0 && ma[i][j]==0)
{
ma[i][j]=3;
out(3,i,j);
ok=1;
}
if(flag==1 && (i+j)%2==1 && ma[i][j]==0)
{
ma[i][j]=3;
out(3,i,j);
ok=1;
}
}
}
}
else
{
if(flag==0){
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
{
if(ok)break;
if((i+j)%2==1 && ma[i][j]==0)
{
ma[i][j]=2;
out(2,i,j);
ok=1;
}
}
check(2);
}
else if(flag==2)
{
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
{
if(ok)break;
if((i+j)%2==0 && ma[i][j]==0)
{
ma[i][j]=1;
out(1,i,j);
ok=1;
}
}
}
else
{
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
{
if(ok)break;
if((i+j)%2==1 && ma[i][j]==0)
{
ma[i][j]=2;
out(2,i,j);
ok=1;
}
}
}
}
}
return 0;
}