当前位置: 代码迷 >> 综合 >> 2021秋季《数据结构》_EOJ 1059. 恢复古诗
  详细解决方案

2021秋季《数据结构》_EOJ 1059. 恢复古诗

热度:7   发布时间:2023-12-10 19:47:39.0

题目

jxtxzzw和好朋友去探险,在山洞里jxtxzzw发现了许多古诗,他很兴奋地呼唤同伴过来,用相机把这些古诗拍下来。每个人都选了一部分进行拍照。

回到学校以后,所有人把相机中的照片导出,保存在电脑。

这时jxtxzzw发现,竟然当时没有让伙伴们按照顺序拍照。

现在这些照片根本就不是有序的,所以这些古代诗歌的碎片完全连不成一个整体。

好在现在有一个线索,在相邻的两张照片中,一定有一句是重复的。分别出现在两张碎片的头和尾。

例如上图是完整的原文,被拍成了 2 张照片,两张照片各保存了 4 行,如下图。
在这里插入图片描述

思路

方法1

在这里插入图片描述
用了两个map和两个数组,

map<string, int> headMap;  // headMap[head]=i:第i张照片的第一行为head
map<string, int> tailMap;
string headArr[1001];  // headArr[i]=head:第i张照片的第一行为head
string tailArr[1001];

查找的时候颠来倒去一下就行。感觉这样的思路还是有些绕的,待改进。

代码

#include<bits/stdc++.h>
using namespace std;map<string, int> headMap;  // headMap[head]=i:第i张照片的第一行为head
map<string, int> tailMap;
string headArr[1001];  // headArr[i]=head:第i张照片的第一行为head
string tailArr[1001];
vector<string> v;
int seq[1001] = {
    0};  // 正确的照片顺序int main()
{
    for(int i=0;i<1001;i++){
    headArr[i]="no";tailArr[i]="no";}int p, l; cin>>p>>l;for(int i = 0; i <= p*l; i++){
    string str;getline(cin,str);v.push_back(str);}for(int i = 0; i < p; i++){
    string head = v[i*l+1];string tail = v[(i+1)*l];// cout<<head<<' '<<tail<<endl;headMap[head] = i;tailMap[tail] = i;headArr[i] = head;tailArr[i] = tail;}// /***************************************/
// cout<<"************"<<endl;
// for(int i = 0; i < p; i++)
// {
    
// cout<<headArr[i]<<endl;
// }
// cout<<"************"<<endl;
// for(int i = 0; i < p; i++)
// {
    
// cout<<tailArr[i]<<endl;
// }
// cout<<"************"<<endl;
// /***************************************/int idx = 0;int flag = 0;  // 是否已经找到第一张照片string nowHead;while (idx<p){
    // 找第一张照片if(!flag){
    for(map<string, int>::iterator it = headMap.begin(); it!=headMap.end(); it++){
    nowHead = it->first;if(tailMap.count(nowHead)==0)// 该head不是任何照片的tail,即该照片为剩余照片中的第一张{
    flag = 1;seq[idx] = it->second;idx++;break;}}}// cout<<nowHead<<endl;int headIdx = headMap[nowHead];  // 这张照片的序号string nowTail = tailArr[headIdx];  // 这张照片的最后一行int nextIdx = headMap[nowTail];  // 最后一行作为首行的照片序号,即下一张照片seq[idx] = nextIdx;idx++;nowHead = headArr[nextIdx];}int j = 0;for(int i = 0; i < p; i++){
    // int idx = seq[i];// cout<<'*'<<idx<<endl;for(j = l*seq[i]+1; j < (seq[i]+1)*l; j++)cout<<v[j]<<endl;}cout<<v[j]<<endl;system("pause");return 0;
}
  相关解决方案