EOJ #3601 恢复古诗

题目描述:

jxtxzzw和好朋友去探险,在山洞里jxtxzzw发现了许多古诗,他很兴奋地呼唤同伴过来,用相机把这些古诗拍下来。每个人都选了一部分进行拍照。回到学校以后,所有人把相机中的照片导出,保存在电脑。这时jxtxzzw发现,竟然当时没有让伙伴们按照顺序拍照。现在这些照片根本就不是有序的,所以这些古代诗歌的碎片完全连不成一个整体。好在现在有一个线索,在相邻的两张照片中,一定有一句是重复的。分别出现在两张碎片的头和尾。例如上图是完整的原文,被拍成了 2 张照片,两张照片各保存了 4 行,如下图。

输入格式

输入的第一行包括两个正整数 Pn⩽1000 表示照片的总数,和 Ln⩽100 表示每张照片包含的诗歌的行数。

随后在 Pn×Ln 行中给出 Pn 张照片的内容,每 Ln 行为一张碎片。

每一行的字符不会超过80个,并且保证每两张相邻的碎片的重复行是唯一的。

输出格式

输出整首诗歌,重复行不重复输出。

样例:

Input
2 3
This is the 3rd line.
This is the 4th line.
This is the 5th line.
This is the 1st line.
This is the 2nd line.
This is the 3rd line.
Output
This is the 1st line.
This is the 2nd line.
This is the 3rd line.
This is the 4th line.
This is the 5th line.

思路分析:

首先,寻找合适的存储结构存放诗句信息。在此选择定义一个诗句结构体,因为图片数量未定,图片中的诗句数量也未定,选择结构体便于诗句的存放。

typedef struct Node {
    string str[101];
} Poem;

static Poem poem[1001];

本题的关键在于找出诗的第一句。因此,首先遍历结构体数组,用每张图片的第一句与其他图片的最后一句比较,如果这张图片的第一句在其他图片的最后一句中出现,则这句必不是诗的第一句,结束本轮查找以节约时间。查找第一句诗的代码如下。

for(i = 0; i < n; i++) {
        str1 = poem[i].str[0];
        loc = i;
        for(j = 0; j < n; j++) {
            if(str1 == poem[j].str[m - 1])
                break;
        }
        if(j == n)
            break;
}

后面的部分较为简单,依次将第i张的图片的最后一句与其他图片的第一句比较,递归遍历。

while(k<n){
    for(i=0;i<n;i++){
        if(poem[loc].str[m-1]==poem[i].str[0]){
            loc=i;
            result[k++]=loc;
            break;
        }
    }
}

代码:

#include <bits/stdc++.h>
using namespace std;

typedef struct Node {
    string str[101];
} Poem;

int main() {
    int i, j, n, m, loc;
    string str1;
    static Poem poem[1001];
    cin >> n >> m;
    cin.get();
    for(i = 0; i < n; i++) {
        for(j = 0; j < m; j++) {
            getline(cin, poem[i].str[j]);
        }
    }
    for(i = 0; i < n; i++) {
        str1 = poem[i].str[0];
        loc = i;
        for(j = 0; j < n; j++) {
            if(str1 == poem[j].str[m - 1])
                break;
        }
        if(j == n)
            break;
    }
    int result[1001];
    int k=0;
    result[k++]=loc;
    while(k<n){
        for(i=0;i<n;i++){
            if(poem[loc].str[m-1]==poem[i].str[0]){
                loc=i;
                result[k++]=loc;
                break;
            }
        }
    }
    cout<<poem[result[0]].str[0]<<endl;
    for(i=0;i<k;i++){
        for(j=1;j<m;j++){
            cout<<poem[result[i]].str[j]<<endl;
        }
    }
    return 0;
}

 

发布了6 篇原创文章 · 获赞 5 · 访问量 236
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览