hdu 1015 带来的启示

这道题,我是用的5重循环过得,
前期WA主要错在,自己加一个判断,求出给出字母序列的最大值,最小值,然后出错了,发现没有必要手工构造就去掉了,然后就AC了。

这道题带来的启示是另一种解法: 深度搜索
这种思路之前还不会,在此mark下。
当遇到循环过多无法使用循环时,采用此方法,思路就是dfs ,深度搜索,代码如下:

#include <iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;


int arr[13];
int result[5];
bool visited[13];
int t;
int n;


//回溯(back)就是把一个变量搜索后,重置成未搜索。
// dsf +back
bool isEqual(){

    int v=result[0];
    int w=result[1];
    int x=result[2];
    int y=result[3];
    int z=result[4];

    return (v-w*w+x*x*x-y*y*y*y+z*z*z*z*z)==t;

}

bool dfs(int time){


    if(time==5){

        return isEqual();
    }

    for(int i=n-1;i>=0;i--){


        if(!visited[i]){

            visited[i]=true;
            result[time]=arr[i];
            if(dfs(time+1)){

                return true;;
            }
            visited[i]=false;
        }

    }

    return false;
}
int main()
{

//v - w^2 + x^3 - y^4 + z^5 = target
    string s;
    bool flag;
    int v,w,x,y,z;

    while(cin>>t>>s){

        if(t==0&&s=="END"){
            break;
        }
        flag=false;
        memset(arr,0,sizeof(arr));
        memset(result,0,sizeof(result));
        memset(visited,false,sizeof(visited));
        int tmin=0;
        int tmax=0;
        n=s.size();

        for(int i=0;i<n;i++){

            arr[i]=(int)(s[i]-64);
            //cout<<arr[i]<<endl;
        }
        sort(arr,arr+n);

        flag=dfs(0);
        if(flag){

            for(int i=0;i<5;i++){
                cout<<(char)(result[i]+64);

            }
            cout<<endl;
        }else{
            cout<<"no solution"<<endl;
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值