信息学奥赛一本通 1220:单词接龙 & 洛谷 P1019 (耙耙 60分答案)

在这里插入图片描述
信息学奥赛一本通 1220:单词接龙 洛谷 P1019

不服老不行,这题我写得用心(不过只有60分),被尚贤秒杀。

要100分AC答案 请看尚贤的答案 https://blog.csdn.net/weixin_42790071/article/details/105601560

这里我提供我的过不了的数据
输入数据:
2
abababab
abababc
a

输出
19

check函数错了,要重写.

#include<bits/stdc++.h>
using namespace std;
int ans; //最大值
int n; 
int v[25]; //使用过多少次 
string a[25]; 

/****************************************************
函数 int check(string a接头的字符, string b结尾的字符)   
判断两个字符是否可以相连接,如果可以输出连接长度,如果不相连输出0 
a="bast"   b="astonish"  return 3 
****************************************************/
/*
	//main()的单步测试
	//自己做测试数据
	// basast astonish  
	// bast ast
	// bast cast
	// bast asc
	// bbast astc
	// as ast
	
	string a,b;
	cin>>a>>b;
	cout<<check(a,b);
*/
int check(string a,string b ){
	int la = a.size();
	int lb = b.size();
	int len=0; // 连接的长度 
	// a="bast"   b="astonish" 
	if(la==1&&b[0]==a[0]){
		return lb;
	} 
	bool break_i = false;
	for(int i=1;i<la;i++){ 
		//如果有一个字符相等,则算它们下面的是否相等  
		if(a[i]==b[0]){ 
			len++;  
			// 找剩余的  (b)ast 与 astonish 对比 
			// bast  ab 和 bast astces 	
			int k; 
			for(k=1; k<=la-i && lb>k ;k++){
				if(a[i+k]==b[k]&&a[i+k]!='\0'){ //如果不加  a[i+k]!='\0' 会把string最后一个\0都一起统计 
					len++; 
				}else{
					//如果有不相等的,就跳出
					//如果跳出时候,第一个字符不是结尾,则不能对接,改len=0
					if( (i+k)!=la ) {
						len=0;
					}else{
						//已经找到结尾和头对应的,跳出上次a的循环
						break_i = true; 
					}
					break;
				}
			}			
			//跳出整个循环
			if(break_i){
				break;
			}
		}
	}
	//cout<<len<<endl; 
	// 如果包含的数字全部是一个数的,则这两个数完全包含 如:bast 接 ast  
	if( len>=la||len>=lb){
		return 0;
	}
	return len;
}
/*
dfs主要函数, x 是目前首字符, sum是当前连接字符数 
*/
void dfs(string x,int sum ){
	ans = max(ans,sum); //更新最大值
	cout<<ans<<"##";
	for(int i=0;i<n;i++){
		if(v[i]>1){
			continue;
		}
		else{
			int jielong = check(x,a[i]); //接合的字符长度 			
			if(jielong!=0&&x!=a[i]){
				
				v[i]++;
				//  a="bast"(这个已经在上次的时候算了)   b="astonish"    add = 3
				// 从上得出传入参数为   lb - add + ans 
				cout<<x<<"@"<<a[i]<<" \n";
				if((a[i].length() - jielong)==0){
					dfs( a[i],   (  jielong  )  );
				}else{
					dfs( a[i],   ( a[i].length() - jielong + sum)  );
				}								
				v[i]--; //回溯 
			} 
		}
	}
	return;
}
int main(){
	freopen("cpp.in","r",stdin);
	freopen("cpp.out","w",stdout);
	
	
//	string a,b;
//	cin>>a>>b;
//	cout<<check(a,b);
	
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cin>>a[n];
	dfs(a[n],0 );
	cout<<ans<<endl;
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值