边框叠加覆盖,可归约为图论搜索,先根据输入把每个框的四个边求出来,这样就确定了一每个框,然后构图,图的边就是覆盖关系,第一步完成了。。然后我是用暴力搜索枚举的方法求全排列,把非法的情况给排除出去,最后输入合法的情况。。感觉数据量大的话这种方法会挂,但是本题数据可能比较水,这样可以过,附上POJ上搜到的测试数据,第一次天真地WA了,数据很有帮助,感谢!
10 10 ....CCC... ....C.C... .BBBB.C... .B..BCCEEE .B..B..E.E GGGBBDDE.E G.G.D.DEEE G.G.DDD... GGG....... .......... CDBEG CDBGE CDEBG CEDBG DCBEG DCBGE DCEBG DECBG ECDBG EDCBG
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<limits.h>
static int h, w;
static char s[30][30];
static int map[26][26];
static char stack[30];
static int total, max, flag[26];
struct Frame
{
int minx, maxx, miny, maxy;
};
static void dfs(int depth)
{
int i;
if (total > 0)
{
for (i = 0; i < total - 1; i++)
if (map[stack[total - 1] - 'A'][stack[i] - 'A'])
return;
}
if (depth == max)
{
for (i = 0; i < total; i++)
putchar(stack[i]);
putchar('\n');
return;
}
for (i = 0; i < 26; i++)
if (!flag[i])
{
flag[i] = 1;
stack[total++] = i + 'A';
dfs(depth + 1);
total--;
flag[i] = 0;
}
}
int main()
{
struct Frame *array = malloc(26 * sizeof(struct Frame));
while (scanf("%d %d", &h, &w) != EOF)
{
getchar();
int i, j, k;
memset(array, 0, 26 * sizeof(struct Frame));
memset(map, 0, sizeof(map));
max = 0;
for (i = 0; i < 26; i++)
{
array[i].minx = array[i].miny = INT_MAX;
flag[i] = 1;
}
for (i = 0; i < h; i++)
{
for (j = 0; j < w; j++)
{
s[i][j] = getchar();
if (s[i][j] == '.')
continue;
int index = s[i][j] - 'A';
if (i < array[index].miny)
array[index].miny = i;
if (i > array[index].maxy)
array[index].maxy = i;
if (j < array[index].minx)
array[index].minx = j;
if (j > array[index].maxx)
array[index].maxx = j;
}
getchar();
}
for (k = 0; k < 26; k++)
if (array[k].maxx)
{
max++;
flag[k] = 0;
char c = k + 'A';
for (i = array[k].miny; i <= array[k].maxy; i++)
if (s[i][array[k].minx] != c)
map[k][s[i][array[k].minx] - 'A'] = 1;
for (i = array[k].miny; i <= array[k].maxy; i++)
if (s[i][array[k].maxx] != c)
map[k][s[i][array[k].maxx] - 'A'] = 1;
for (j = array[k].minx; j <= array[k].maxx; j++)
if (s[array[k].miny][j] != c)
map[k][s[array[k].miny][j] - 'A'] = 1;
for (j = array[k].minx; j <= array[k].maxx; j++)
if (s[array[k].maxy][j] != c)
map[k][s[array[k].maxy][j] - 'A'] = 1;
}
dfs(0);
}
free(array);
return 0;
}