afecracker HDU - 1015

本文详细解析了HDU 1015题目,通过回溯算法解决复合表达式的字母搜索问题。同时,探讨了字符串操作中遇到的赋值与输出难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://acm.hdu.edu.cn/showproblem.php?pid=1015

题解 就是找复合题中给定的表达式的五个字母 搜索 注意回溯

#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<math.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1000000;
char v,w,x,y,z;
int n;
int len=0;
int  vis[50];
//string a,ans;
string s;
char ans[50];
char a[50];
void dfs(int k){
	if(k==5){
	  if((a[0]-'A'+1)-pow(a[1]-'A'+1,2)+pow(a[2]-'A'+1,3)-pow(a[3]-'A'+1,4)+pow(a[4]-'A'+1,5)==n){
	       if(strcmp(a,ans)>0){
	       	    strcpy(ans,a);
		   }
//	     	a[5]='\0';
//          cout<<a<<endl;
//	     	string cnt="";
//            cnt=cnt+a[0]+a[1]+a[2]+a[3]+a[4]+a[5];
//            if(cnt>ans) {
//           	ans=cnt;
//		   }
           //cout<<ans;
	  }
	  return ;
	}
	for(int i=0;i<len;i++){
		if(!vis[i]){
			a[k]=s[i];
			vis[i]=1;
			dfs(k+1);//注意不能k++, 否则回溯后就是k++的值了,而不是之前的值 
			vis[i]=0;//回溯 
		}
	}	
}
int main(){
	while(cin>>n>>s){
		if(n==0&&s=="END") break;
		memset(vis,0,sizeof(vis));
	    memset(a,'\0',sizeof(a));
	    memset(ans,'\0',sizeof(ans));
		len=s.size();
//		a="";
//		ans="";
		dfs(0);//字母个数 
		
		int ll=strlen(ans);
		if(ll==0){
			cout<<"no solution"<<endl;
		}
		else{
		    for(int i=0;i<ll;i++){
		    	cout<<ans[i];
			}
			cout<<endl;
       //cout<<ans<<endl;
		}
	
	}
} 

///////////////////遇到个问题

字符串a 如果那样赋值后,尽然输不出东西

#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1000000;
string a,b,c;
int main(){
	a="";
	b="";
	c="";
	a[0]='A';
	a[1]='B';
	a[2]='C';
	a[3]='\0';
	b=a;
	c=c+a[0]+a[1]+a[2];
	cout<<a.size()<<endl;
	cout<<ans<<endl;
//	cout<<c.size();
//	cout<<b<<endl;
//	cout<<c<<endl;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值