在自己电脑上跑了几个测试点没发现毛病欸...
结果就re+wa
思路:从左到右依次遍历,遇到相邻(右和下)不同的就填色,边界及特殊情况特殊处理。
蒟蒻代码如下:
#include<bits/stdc++.h>
using namespace std;
bool arr[100010][5],tip[100010][5],re[15]//填色数组;
int main()
{
ios::sync_with_stdio(0);
int T, n;
cin >> T;
for (int i = 0; i < T; i++)
{
memset(tip, 0, sizeof(tip));
memset(arr, 0, sizeof(arr));
cin >> n;
getchar();
for (int k = 0; k < n; k++)
{
arr[k][0] = (int)(getchar() - 48);
}
getchar();
for (int k = 0; k < n; k++)
{
arr[k][1] = (int)(getchar() - 48);
}//二维数组读入
for (int p = 0; p < n; p++)//第一行
{
if (tip[p][0] == 1)//已填就跳
{
continue;
}
if (p == n - 1)//边界
{
if (arr[p][0] == 1)
{
if (arr[p][1] != 0)
{
re[i] = 1;
goto next;
}
else {
tip[p][0] = tip[p][1] = 1;
break;
}
}
}
if (arr[p][0] == 0)
{
if (arr[p + 1][0] == 1)
{
tip[p][0] = tip[p + 1][0] = 1;
}
else if (arr[p][1] == 1)
{
tip[p][0] = tip[p][1] = 1;
}
}
else if (arr[p][0] == 1)
{
if (arr[p + 1][0] == 0)
{
tip[p][0] = tip[p + 1][0] = 1;
}
else if (arr[p][1] == 0)
{
tip[p][0] = tip[p][1] = 1;
}
else {
re[i] = 1;
goto next;
}
}
}
for (int p = 0; p < n; p++)//第二行
{
if (tip[p][1] == 1)//已填就跳
{
continue;
}
if (p == n - 1)//边界
{
if (arr[p][1] == 1)
{
re[i] = 1;
goto next;
}
break;
}
if ((arr[p][1] == 0) && (arr[p + 1][1] == 1) && (tip[p + 1][1]!=1))
{
tip[p][1] = tip[p+1][1] = 1;
}
else if (arr[p][1] == 1)
{
if ((arr[p + 1][1] == 0) && (tip[p + 1][1] != 1))
{
tip[p + 1][1] = tip[p][1] = 1;
}
else
{
re[i] = 1;
break;
}
}
}
next:;
}
for (int i = 0; i < T; i++)
{
if (re[i] == 1)
printf("++\n");
else
printf("RP\n");
}
return 0;
}