一般模拟题,不算太麻烦,找出唯一标识字的一像素或两像素,直接枚举硬搞吧
#include<cstdio>
#include<vector>
using namespace std;
namespace
{
int n, r, c;
char s[10][100];
bool check_one(vector<vector<pair<int, int> > > &V, size_t index)
{
vector<pair<int, int> > &v = V[index];
for (size_t k = 0; k < v.size(); k++)
{
pair<int, int> &p = v[k];
int basei = p.first;
int basej = p.second - index * (c + 1);
bool find = true;
for (size_t t = 0; t < V.size(); t++)
{
if (t == index)
continue;
int i = basei;
int j = basej + t * (c + 1);
if (s[i][j] != '.')
{
find = false;
break;
}
}
if (find)
{
s[p.first][p.second] = '#';
return true;
}
}
return false;
}
bool check_two(vector<vector<pair<int, int> > > &V, size_t index)
{
vector<pair<int, int> > &v = V[index];
for (size_t k = 0; k < v.size(); k++)
for (size_t l = k + 1; l < v.size(); l++)
{
pair<int, int> &p1 = v[k];
pair<int, int> &p2 = v[l];
int firstj = p1.second - index * (c + 1);
int secondj = p2.second - index * (c + 1);
bool find = true;
for (size_t t = 0; t < V.size(); t++)
{
if (t == index)
continue;
int j1 = firstj + t * (c + 1);
int j2 = secondj + t * (c + 1);
if (s[p1.first][j1] != '.' && s[p2.first][j2] != '.')
{
find = false;
break;
}
}
if (find)
{
s[p1.first][p1.second] = '#';
s[p2.first][p2.second] = '#';
return true;
}
}
return false;
}
}
int main()
{
int cs = 0;
vector<vector<pair<int, int> > > V;
while (scanf("%d %d %d", &n, &r, &c), n || r || c)
{
printf("Test %d\n", ++cs);
getchar();
for (int i = 0; i < r; i++)
gets(s[i]);
V.clear();
for (int k = 0; k < n; k++)
{
vector<pair<int, int> > v;
int begin = k * (c + 1);
for (int i = 0; i < r; i++)
for (int j = begin; j < begin + c; j++)
if (s[i][j] == 'o')
v.push_back(make_pair(i, j));
V.push_back(v);
}
bool res = true;
for (size_t k = 0; k < V.size(); k++)
if (!check_one(V, k))
if (!check_two(V, k))
{
res = false;
break;
}
if (!res)
puts("impossible");
else
for (int i = 0; i < r; i++)
puts(s[i]);
}
}