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