afecracker HDU - 1015

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;
} 

猜你喜欢

转载自blog.csdn.net/gml1999/article/details/88545108