其实就是一个拓补排序。(动态记录第i个之上的j存不存在,反过来就是第j个之下的i)
首先确立每个框的位置(题目明确说了每一边都不会被完全覆盖)。/*可以通过搜索,搜索到该框的所有四个角*/||如果题目要求在严格一点,这个题目难度几何增加,在一定范围内是可算顺序的。
检查边框的位置如果不是原来的字母,则说明原来的字母被现在的字母覆盖,得到一个局部大小关系(计算第j个下i的数量,0的话就确定下来这个j的位置了),接下来的就是拓补排序了。
值得一提的是如果有多种可能的话,要按字典顺序逐个输出。(隐含的就是在循环遍历,默认条件就是字典顺序)
#include#include int topo[26][26];char map[31][31];int xmax[26],xmin[26],ymax[26],ymin[26];/*每个字母框的四个角,即x的两个极值和y的两个极值*/char result[28];/*字母框掩盖的结果*/int h,w;int exist[26];/*创建一个可能的所有字母框,如果出现就记录它是否出现*/int used[26];/*已经确定的字母框*/int sum; void solve(int step)/*所有出现的框 解决第几个框*/{ int s[26]; int i,j; if(step==sum)/*如果解决的框到超出正常一个证明前面所有sum个框都确定了顺序*/ { for(i=0;i xmax[map[i][j]-'A']) xmax[map[i][j]-'A'] = j; if(j ymax[map[i][j]-'A']) ymax[map[i][j]-'A'] = i; if(i