题目链接:zoj 3780
Sample Input
2 2 XX OX 2 XO OX
Sample Output
R2 C1 R1 No solution
题目意思:X表示黑色,O表示白色,可以把一行刷成黑色,把一列刷成白色,输出一种方案完成给出的颜色;
代码如下:
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
struct ans
{
char c;
int id;
}an[250005];
int main()
{
int t,n;
scanf("%d",&t);
int r[505],c[505];
char a[505][505];
while(t--)
{
scanf("%d",&n);
memset(r,0,sizeof(r));
memset(c,0,sizeof(c));
for(int i = 0;i < n;i++)
{
for(int j = 0;j < n;j++)
{
cin >> a[i][j];
if(a[i][j] == 'X')
r[i]++;
else
c[j]++;
}
}
int rn = n,cn = n,cnt = 0;
while(1)
{
for(int i = n - 1;i >= 0;i--)
{
if(r[i] == rn && rn)
{
an[cnt].c = 'R',an[cnt].id = i + 1;
cnt++,cn--;
}
}
for(int i = n - 1;i >= 0;i--)
{
if(c[i] == cn && cn)
{
an[cnt].c = 'C',an[cnt].id = i + 1;
cnt++,rn--;
}
}
if(cnt == 0 || rn == 0 || cn == 0)
break;
}
if(cnt == 0)
printf("No solution\n");
else
{
for(int i = cnt - 1;i > 0;i--)
printf("%c%d ",an[i].c,an[i].id);
printf("%c%d\n",an[0].c,an[0].id);
}
}
return 0;
}