華爲OJ練習題 -- 39. 24點遊戲 -- 全排序dfs的使用

參考https://mp.csdn.net/postedit/100632372,先了解下基本的全排序

基於指定的一組排序進行計算時,需要繼續遍歷 + - * /, 其中特別注意減法順序(是否可優化?)及除零問題

#include <math.h>
#include <string.h>
#include <stdio.h>

double pai[4] = {1,5,5,5};
bool visited[4] = {0};     //判斷是否使用過, 初始化默認未使用
bool dfs(int x)
{
    int i,j;
    double nu1,nu2;
    if(x==3){    //4個數都用完後判斷是否等於24,使用近似精度防止1/3*3之類的情況
        for(i=0;i<4;i++){
            if(!visited[i]&&abs(pai[i]-24.0)<0.000001) return 1;
        }
        return 0;
    }
    for(i=0;i<4;i++){    // ********** 技巧:全排序 
        if(!visited[i])  // 判斷是未使用的牌
            for(j=i+1;j<4;j++)
                if(!visited[j])
                {
                    visited[j]=1;
                    nu1=pai[i];
                    nu2=pai[j];
                    pai[i]=nu1+nu2; if(dfs(x+1)) return 1;
                    pai[i]=nu1-nu2; if(dfs(x+1)) return 1;
                    pai[i]=nu2-nu1; if(dfs(x+1)) return 1;
                    pai[i]=nu1*nu2; if(dfs(x+1)) return 1;
                    if(nu2!=0)
                        pai[i]=nu1/nu2; if(dfs(x+1)) return 1;
                    if(nu1!=0)
                        pai[i]=nu2/nu1; if(dfs(x+1)) return 1;    //對所有情況窮舉
                    
                    pai[i]=nu1;        //恢復數據,進行後續循環
                    visited[j]=0;      //恢復標記
                }
    }
    return 0;
}

int main()
{
    dfs(0)? printf ("yes") : printf ("no");

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章