zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
  • 相关阅读:
    树链剖分 (模板) 洛谷3384
    ST表 (模板) 洛谷3865
    IOI 2005 River (洛谷 3354)
    IOI 2005 River (洛谷 3354)
    poj1094 Sorting It All Out
    poj1094 Sorting It All Out
    spfa(模板)
    HAOI 2006 受欢迎的牛 (洛谷2341)
    HAOI 2006 受欢迎的牛 (洛谷2341)
    洛谷1850(NOIp2016) 换教室——期望dp
  • 原文地址:https://www.cnblogs.com/olinr/p/10456205.html
Copyright © 2011-2022 走看看