1.31总结

文章描述了作者尝试用C++编写函数来计算两个字符串的最长重叠部分长度,并解决一个涉及陨石轨迹和地球坐标的问题。代码中涉及到link函数、DFS搜索以及一个可能存在问题的BFS算法。
摘要由CSDN通过智能技术生成

先写了一个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;
}

  • 28
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值