#P2084. 染色.填空题
染色.填空题
题目描述
有一个 R 行 C 列的二维数组 board ,如果board[i][j]= 'R' 则表示第 i 行第 j 列的格子是石头,如果 board[i][j]= '.' 则表示第 i 行第 j 列的格子是空地。
石头 A 和石头 B 是 冲突 的前提是同时满足如下的所有条件:
- 石头 A 和石头 B 的颜色不同。
- 石头 A 和石头 B 在同一行或者同一列。
- 石头 A 与石头 B 之间没有其他的石头。
你要对所有的石头进行染色,但必须保证所有的石头都不能有 冲突 。在满足上述的所有条件的前提下,你希望用到的颜色种类越多越好,输出最多的颜色种类。
输入格式
多组测试数据。
第一行,一个整数G,表示有G组测试数据。1 <= G <= 10。
每组测试数据格式如下:
第一行,两个整数 R 和 C 。 1 <= R,C <= 20。
接下来是 R 行 C 列的二维数组 board 。board[i][j]='R'或 '.'
输出格式
共 G 行,每行一个整数。
样例
3
3 4
.R.R
R.R.
.R.R
1 15
RRRRRRRRRRRRRRR
6 15
...............
...............
...............
...............
...............
...............
2
1
0
完善程序
#include<bits/stdc++.h>
using namespace std;
string s[21];
bool f[21][21];
int r,c,tail,head;
struct Point
{
int r,c;
}q[1000];
void bfs()
{
int x,y;
Point t;
while(head<tail) // 判断队列是否为空
{
t = q[head++]; //取出队首,然后弹出队首
x = t.r;
y = t.c;
for(int i=1;i<=r;i++)
{
if( 填空(1) &&s[i][y]=='R'){
f[i][y] = true;
q[tail].r = 填空(2);
q[tail].c = 填空(3);
填空(4);
}
}
for(int j=1;j<=c;j++)
{
if(!f[x][j]&& 填空(5) ){
f[x][j] = true;
q[tail].r = 填空(6);
q[tail].c = 填空(7);
填空(4);
}
}
}
}
int main()
{
int g,cnt;
cin>>g;
while(g--)
{
cin>>r>>c;
for(int i=1;i<=r;i++)
{
cin>>s[i];
s[i] = '.' + s[i]; //为了从下标 1 开始计算 ,前面随便加点东西
}
//针对每一组新的数据,都要让 f 数组复位。 f 数组是记录着一块石头是否已经被染色
memset(f,false,sizeof(f));
cnt = 0;
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
if((填空(8)&&!f[i][j])
{
q[0].r = i;
q[0].c = j;
f[i][j] = true;
head=0;
tail = (填空(9);
cnt = (填空(10);
bfs();
}
}
}
printf("%d\n",cnt);
}
return 0;
}
填空(1): {{ input(1) }}
填空(2): {{ input(2) }}
填空(3): {{ input(3) }}
填空(4): {{ input(4) }}
填空(5): {{ input(5) }}
填空(6): {{ input(6) }}
填空(7): {{ input(7) }}
填空(8): {{ input(8) }}
填空(9): {{ input(9) }}
填空(10): {{ input(10) }}