先写了一个link函数求俩字符串重叠长度,find函数负责dfs寻找最长长度,u[]保存使用次数,lh保存最长长度,
#include<bits/stdc++.h>
#include<cstring>
using namespace std;
string str[20];
int u[20], lh=0,n;
int link(string s1, string s2) {
for(int i = 1; i < min(s1.length(), s2.length()); i++) {
int flag = 1;
for(int j = 0; j < i; j++)
if(s1[s1.length() - i + j] != s2[j]) flag = 0;
if(flag) return i;
}
return 0;
}
void find(string strnow, int length) {
lh = max(length, lh);
for(int i = 0; i < n; i++) {
if(u[i] >= 2) continue;
int c =link(strnow, str[i]);
if(c > 0) {
u[i]++;
find(str[i],length+str[i].length()-c);
u[i]--;
}
}
}
main() {
cin>>n;
for(int i=0;i<=n;i++) u[i]=0,cin >> str[i];
find(' '+str[n],1);
cout<<lh;
}
我的思路是建立一个包含x,y,t的结构体,再把earth初始化为零,把陨石的到达时间与坐标写入earth,再进行bfs,但下面代码有误,无法求出答案,还没找到问题所在。
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<queue>
using namespace std;
int earth[310][310]={0};
int vis[310][310]={0};
int dx[]={1,0,-1,0,0};
int dy[]={0,-1,0,1,0};
int all;
struct point{
int x;
int y;
int t;
};
queue<point> q;
int main(){
cin>>all;
int y1,x1,t1,xx,yy,tt,bo=0;
for(int i=0;i<all;i++){
cin>>x1>>y1>>t1;
for(int p=0;p<5;p++)
if(x1+dx[p]>=0&&y1+dy[p]>=0){
if(earth[x1+dx[p]][y1+dy[p]]==0||t1<earth[x1+dx[p]][y1+dy[p]]);
earth[x1+dx[p]][y1+dy[p]]=t1;
}
}
//for(int i=0;i<10;i++){
// for(int p=0;p<10;p++){
// printf("%d ",earth[i][p]);
// }
// printf("\n");
//}
struct point a1;
a1.t=0;a1.x=0;a1.y=0;vis[0][0]=1;
q.push(a1);
while(!q.empty()){
if(earth[q.front().x][q.front().y]==0){
bo=1;
break;
}
for(int i=0;i<4;i++){
if(vis[q.front().x+dx[i]][q.front().y+dy[i]]==0&&q.front().y+dy[i]>=0&&q.front().x+dx[i]>=0&&earth[q.front().x+dx[i]][q.front().y+dy[i]]>q.front().t){
a1.x=q.front().x+dx[i];a1.y=q.front().y+dy[i];a1.t=q.front().t+1;
vis[a1.x][a1.y]=1;
q.push(a1);
}
}
//cout<<a1.x<<' '<<a1.y<<endl;
q.pop();
}
if(bo) printf("%d",q.front().t);
else printf("-1");
return 0;
}