题目描述
很久以前,有一个传说中的“EWF”部族,他们世代生活在一个N×M的矩形大地上。虽然,生活的地区有高山、有沼泽,但通过勤劳勇敢,渐渐地,他们在自己的地盘上修筑了一条回路。
后来,“EWF”部族神秘地消失了。不过,考古学家在那片他们曾经生活过的地方找到了一份地图。地图是N×M的矩阵,左上角的坐标为(0, 0),右下角的坐标为(N, M)。矩阵中的每个格子,表示高山、沼泽、平地、房屋或是道路其中之一。如果一个格子表示道路,那么经过这个格子的道路要么是直走,要么是拐弯。如下图,左边2幅表示直走格子的,右边4幅表示需要拐弯的格子。一个表示道路的格子只能表示下列情况之一。
可是,由于地图的年代久远,考古学家虽然能分清一个格子代表的地形,可对于道路的标记,考古学家们只能分清这一格是表示直走的还是拐弯的。现在,他们求助于你,希望你能帮助他们复原这份“EWF”部族的地图。
输入输出格式
输入格式:
输入文件recover.in的第一行包含两个用空格分隔的正整数N和M,分别表示地图的高和长。
接下来一个N行M列的矩阵描述地图,矩阵中没有多余字符。
大写“S”表示直走的道路,大写“T”表示拐弯的道路,点“.”表示高山、沼泽、平地和房屋。
输出格式:
输出文件recover.out包含2N-1行,每行2M-1个字符,描述了这条回路。
所有第2i+1行的2j+1个字符为小写字母o,表示了矩阵的第i行第j列的格子的中心(i, j)。
若回路包含了(i, j)到(i, j+1)或(i, j+1)到(i, j)的一条路径,则第2i+1行的第2j+2个字符为减号“-”(ASCII码为45);
若回路包含了(i, j)到(i+1, j)或(i+1, j)到(i, j)的一条路径,则第2i+2行的第2j+1个字符为竖线“|”(ASCII码为124)。
其它以上未说明位置上的字符为空格(ASCII码为32)。
输入数据保证至少存在一个合法解,故你的输出应有且仅有一条回路。如果存在多组答案,请输出任意一组。
输入输出样例
说明
对于20%的数据,有N ≤ 10;
对于40%的数据,有1 ≤ N, M ≤ 80;
对于40%的数据,输入没有“.”,且N, M > 10;
对于100%的数据,满足1 ≤ N, M ≤ 800。
第一眼感觉是神奇建图的哈密尔顿回路,但是一想到哈密尔顿回路是npc的就打消了这种想法。
然后发现智商下线了,实际上如果一定有解的话,有一种很简单的构造方式。直接横行把T两两配对,纵行把T两两配对,S直接连就可以了。
怕是做题做傻了
#include<cstdio> using namespace std; const int maxn = 805; int n, m, last; char mp[maxn][maxn]; int D[maxn][maxn], R[maxn][maxn]; int main() { scanf("%d%d", &n, &m); for(register int i = 1; i <= n; ++i) scanf("%s", mp[i] + 1); for(register int i = 1; i <= n; ++i) { last = 0; for(register int j = 1; j <= m; ++j) if(mp[i][j] == 'T') if(last) { for(register int k = last; k <= j - 1; ++k) R[i][k] = 1; last = 0; } else last = j; } for(register int i = 1; i <= m; ++i) { last = 0; for(register int j = 1; j <= n; ++j) if(mp[j][i] == 'T') if(last) { for(register int k = last; k <= j - 1; ++k) D[k][i] = 1; last = 0; } else last = j; } for(register int i = 1; i <= n; ++i) { for(register int j = 1; j <= m; ++j) { putchar('o'); if(R[i][j]) putchar('-'); else putchar(' '); } if(i == n) break; putchar('\n'); for(register int j = 1; j <= m; ++j) { if(D[i][j]) putchar('|'); else putchar(' '); putchar(' '); } putchar('\n'); } return 0; }
没有帐号? 立即注册