• [SDOI2009]地图复原


    题目描述

    很久以前,有一个传说中的“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)。

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

    输入输出样例

    输入样例#1: 
    3 4
    TST.
    S.TT
    TSST
    
    输出样例#1: 
    o-o-o o
    |   |  
    o o o-o
    |     |
    o-o-o-o
    

    说明

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

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

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

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

    code:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cstdlib>
     4 #include<iostream>
     5 #include<algorithm>
     6 
     7 using namespace std;
     8 
     9 const int MAXX = 810;
    10 int N, M, links[MAXX][MAXX], linkx[MAXX][MAXX];
    11 char Map[MAXX][MAXX];
    12 
    13 int main() {
    14     scanf("%d%d", &N, &M);
    15     for (int i = 1; i <= N; ++ i) 
    16         scanf("%s", Map[i] + 1);
    17     
    18     for (int i = 1; i <= N; ++ i) {
    19         int temp = 0, st;
    20         for (int j = 1; j <= M; ++ j) {
    21             if (Map[i][j] == 'T') {
    22                 ++ temp;
    23                 if (temp == 1) st = j;
    24                 else {
    25                     temp = 0;
    26                     for (int k = st; k <= j - 1; ++ k) links[i][k] = 1;
    27                 }
    28             }    
    29         }
    30     }
    31     
    32     for (int j = 1; j <= M; ++ j) {
    33         int temp = 0, st;
    34         for (int i = 1; i <= N; ++ i) {
    35             if (Map[i][j] == 'T') {
    36                 ++ temp;
    37                 if (temp == 1) st = i;
    38                 else {
    39                     temp = 0;
    40                     for (int k = st; k <= i - 1; ++ k) linkx[k][j] = 1;
    41                 }
    42             }
    43         } 
    44     }
    45     
    46     for (int i = 1; i <= 2 * N - 1; ++ i) {
    47         if (i % 2 == 1) {
    48             int k = (i + 1) / 2;
    49             for (int j = 1; j <= M; ++ j) {
    50                 printf("o");
    51                 if (links[k][j]) printf("%c", 45);
    52                 else printf(" ");
    53             }
    54             puts("");
    55         }
    56         else {
    57             int k = (i + 1) / 2;
    58             for (int j = 1; j <= M; ++ j)
    59                 if (linkx[k][j]) printf("%c ", 124);
    60                 else printf("  ");
    61             puts("");
    62         }
    63     }
    64     return 0;
    65 } 
  • 相关阅读:
    写在连载之前——DIY微型操作系统篇
    footer始终在页面最底部的方法(问题待检验)
    各种二级菜单代码
    复选框已经有checked,但是页面没有选中效果(解决)
    px em rem 的区别
    marquee标签详解
    Docker:正常运行的容器突然端口不通一般检查方法
    linux中 vm.overcommit_memory 的含义
    redis6 redis-cli cluster的使用总结
    利用Java反射机制优化简单工厂设计模式
  • 原文地址:https://www.cnblogs.com/hkttg/p/8677872.html
Copyright © 2020-2023  润新知