• P2407 [SDOI2009]地图复原


    $ color{#0066ff}{ 题目描述 }$

    很久以前,有一个传说中的“EWF”部族,他们世代生活在一个N×M的矩形大地上。虽然,生活的地区有高山、有沼泽,但通过勤劳勇敢,渐渐地,他们在自己的地盘上修筑了一条回路。

    后来,“EWF”部族神秘地消失了。不过,考古学家在那片他们曾经生活过的地方找到了一份地图。地图是N×M的矩阵,左上角的坐标为(0, 0),右下角的坐标为(N, M)。矩阵中的每个格子,表示高山、沼泽、平地、房屋或是道路其中之一。如果一个格子表示道路,那么经过这个格子的道路要么是直走,要么是拐弯。如下图,左边2幅表示直走格子的,右边4幅表示需要拐弯的格子。一个表示道路的格子只能表示下列情况之一。

    img

    可是,由于地图的年代久远,考古学家虽然能分清一个格子代表的地形,可对于道路的标记,考古学家们只能分清这一格是表示直走的还是拐弯的。现在,他们求助于你,希望你能帮助他们复原这份“EWF”部族的地图。

    (color{#0066ff}{输入格式})

    输入文件recover.in的第一行包含两个用空格分隔的正整数N和M,分别表示地图的高和长。

    接下来一个N行M列的矩阵描述地图,矩阵中没有多余字符。

    大写“S”表示直走的道路,大写“T”表示拐弯的道路,点“.”表示高山、沼泽、平地和房屋。

    (color{#0066ff}{输出格式})

    输出文件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)。

    输入数据保证至少存在一个合法解,故你的输出应有且仅有一条回路。如果存在多组答案,请输出任意一组。

    (color{#0066ff}{输入样例})

    3 4
    TST.
    S.TT
    TSST
    

    (color{#0066ff}{输出样例})

    o-o-o o
    |   |  
    o o o-o
    |     |
    o-o-o-o
    

    (color{#0066ff}{数据范围与提示})

    对于20%的数据,有N ≤ 10;

    对于40%的数据,有1 ≤ N, M ≤ 80;

    对于40%的数据,输入没有“.”,且N, M > 10;

    对于100%的数据,满足1 ≤ N, M ≤ 800。

    (color{#0066ff}{题解})

    通过样例以及题目可以得出,每行每列一定有偶数个T

    于是。。。这题居然就变成模拟了!!

    把相邻的T连起来就行了。。

    #include<bits/stdc++.h>
    #define LL long long
    LL in() {
    	char ch; LL x = 0, f = 1;
    	while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
    	for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
    	return x * f;
    }
    const int maxn = 1050;
    char getch() {
    	char ch = getchar();
    	while(!isalpha(ch) && ch != '.') ch = getchar();
    	return ch;
    }
    
    char mp[maxn][maxn];
    int dn[maxn][maxn], re[maxn][maxn];
    int main() {
    	int n = in(), m = in();
    	for(int i = 1; i <= n; i++)
    		for(int j = 1; j <= m; j++) 
    			mp[i][j] = getch();
    	for(int i = 1; i <= n; i++) {
    		int lst = 0;
    		for(int j = 1; j <= m; j++) {
    			if(mp[i][j] == 'T') {
    				if(!lst) lst = j;
    				else {
    					for(int k = lst; k < j; k++) re[i][k] = true;
    					lst = 0;
    				}
    			}
    		}
    	}
    	for(int i = 1; i <= m; i++) {
    		int lst = 0;
    		for(int j = 1; j <= n; j++) {
    			if(mp[j][i] == 'T') {
    				if(!lst) lst = j;
    				else {
    					for(int k = lst; k < j; k++) dn[k][i] = true;
    					lst = 0;
    				}
    			}
    		}
    	}
    	for(int i = 1; i <= 2 * n - 1; i++) {
    		for(int j = 1; j <= 2 * m - 1; j++) {
    			if((i & 1) && (j & 1)) putchar('o');
    			else if(i & 1) putchar(re[(i + 1) >> 1][j >> 1]? '-' : ' ');
    			else if(j & 1) putchar(dn[i >> 1][(j + 1) >> 1]? '|' : ' ');
    			else putchar(' ');
    		}
    		puts("");
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    E
    J
    D
    并查集加优先队列
    动态规划-数位DPwindy
    动态规划-分组背包问题
    动态规划-LIS1
    动态规划-01背包
    [cf1434E]A Convex Game
    [atAGC106F]Figures
  • 原文地址:https://www.cnblogs.com/olinr/p/10456205.html
Copyright © 2020-2023  润新知