写代码时遇到的玄学情况求助
  • 板块学术版
  • 楼主Dark_X
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/10/27 10:19
  • 上次更新2023/11/5 09:46:18
查看原帖
写代码时遇到的玄学情况求助
101000
Dark_X楼主2020/10/27 10:19

当dfs时直接输出答案会炸掉 如下代码

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int len,ans=0x3f3f3f3f;
int a[1000100],sum[1000100];
char t[1000100],s[1000100];

bool check(){
	memset(sum,0,sizeof sum);
	for(int i=1;i<=len;++i) sum[i]=sum[i-1]+a[i];
	if(sum[len]==len||sum[len]==0) return true;
	int l;
	for(int i=1;i<=len;++i){
		if(sum[i]==1) l=i-1;
		if(sum[len]-sum[l]==len-l) return true;
	}
	return false;
}

void dfs(int now,int sum){ 
	if(now==len){
		if(check()) ans=min(ans,sum);
		return;
	}
	if(a[now]==0){
		dfs(now+1,sum);
		a[now]=1;
		dfs(now+1,sum+1);
		a[now]=0;
	}
	else{
		dfs(now+1,sum);
		a[now]=0;
		dfs(now+1,sum+1);
		a[now]=1;
	}
}

int main(){
	cin>>t;
	len=strlen(t);
	for(int i=0;i<len;++i) s[i+1]=t[i];
	for(int i=1;i<=len;++i) a[i]=s[i]-'0';
	dfs(1,0);
	cout<<endl<<endl<<ans;
	
	return 0;
}

但是 如果在dfs中输出一个数后 不会炸掉并且可以输出最后的答案 如下

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int len,ans=0x3f3f3f3f;
int a[1000100],sum[1000100];
char t[1000100],s[1000100];

bool check(){
	memset(sum,0,sizeof sum);
	for(int i=1;i<=len;++i) sum[i]=sum[i-1]+a[i];
	if(sum[len]==len||sum[len]==0) return true;
	int l;
	for(int i=1;i<=len;++i){
		if(sum[i]==1) l=i-1;
		if(sum[len]-sum[l]==len-l) return true;
	}
	return false;
}

void dfs(int now,int sum){ 
	cout<<1<<" ";//输出任意一个数 
	if(now==len){
		if(check()) ans=min(ans,sum);
		return;
	}
	if(a[now]==0){
		dfs(now+1,sum);
		a[now]=1;
		dfs(now+1,sum+1);
		a[now]=0;
	}
	else{
		dfs(now+1,sum);
		a[now]=0;
		dfs(now+1,sum+1);
		a[now]=1;
	}
}

int main(){
	cin>>t;
	len=strlen(t);
	for(int i=0;i<len;++i) s[i+1]=t[i];
	for(int i=1;i<=len;++i) a[i]=s[i]-'0';
	dfs(1,0);
	cout<<endl<<ans;
	
	return 0;
}
输入:1010000101
输出:3

玄学求助

2020/10/27 10:19
加载中...