码迷,mamicode.com
首页 > 其他好文 > 详细

HDU - 1427 / UESTC - 1252 经典dfs

时间:2018-01-20 14:06:25      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:std   char   log   size   define   cin   代码   cout   return   

很好奇为什么hzwer那种稍改一下还是无法过样例,代码我没看出问题
换了一种用桶组合挑取两个数不断回溯的做法
这是HDU1427的代码,后者改一改就行了

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
int a[10];
int SET[10];
int dfs(int left){
    if(left==1){
        rep(i,1,4) if(~SET[i]){
            return SET[i]==24;
        }
        return 0;
    }
    rep(i,1,4){
        if(SET[i]==-1)continue;
        rep(j,i+1,4){
            if(SET[j]==-1)continue;
            int a=SET[i],b=SET[j];
            SET[i]=SET[j]=-1;
            SET[i]=a+b;
            if(dfs(left-1)) return 1;
            SET[i]=a-b;
            if(dfs(left-1)) return 1;
            SET[i]=b-a;
            if(dfs(left-1)) return 1;
            SET[i]=a*b;
            if(dfs(left-1)) return 1;
            if(b&&a%b==0)SET[i]=a/b;
            if(dfs(left-1)) return 1;
            if(a&&b%a==0) SET[i]=b/a;
            if(dfs(left-1)) return 1;
            SET[i]=a;SET[j]=b;
        }
    }
    return 0;
}
char s[7][10];
int main(){
    while(cin>>s[1]>>s[2]>>s[3]>>s[4]){
        rep(i,1,4){
            if(s[i][0]==‘A‘) a[i]=1;
            else if(s[i][0]==‘J‘) a[i]=11;
            else if(s[i][0]==‘Q‘) a[i]=12;
            else if(s[i][0]==‘K‘) a[i]=13;
            else if(s[i][0]==‘1‘&&s[i][1]==‘0‘) a[i]=10;
            else a[i]=s[i][0]-‘0‘;
        }
        rep(i,1,4) SET[i]=a[i];
        memset(s,0,sizeof s);
        if(dfs(4)) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
} 

HDU - 1427 / UESTC - 1252 经典dfs

标签:std   char   log   size   define   cin   代码   cout   return   

原文地址:https://www.cnblogs.com/caturra/p/8320431.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!