题目
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;
}