1. 程式人生 > >藍橋杯 帶分數 DFS

藍橋杯 帶分數 DFS

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                問題描述

100 可以表示為帶分數的形式:100 = 3 + 69258 / 714。

還可以表示為:100 = 82 + 3546 / 197。

注意特徵:帶分數中,數字1~9分別出現且只出現一次(不包含0)。

類似這樣的帶分數,100 有 11 種表示法。

輸入格式

從標準輸入讀入一個正整數N (N<1000*1000)

輸出格式

程式輸出該數字用數碼1~9不重複不遺漏地組成帶分數表示的全部種數。

注意:不要求輸出每個表示,只統計有多少表示法!

樣例輸入1 100 樣例輸出1 11 樣例輸入2 105 樣例輸出2 6   一道比較簡單的DFS,首先我們可以先列舉整數,然後再列舉分母,找到所有的情況即可    
#include
<stdio.h>
#include <iostream>#include <string.h>#include <algorithm>using namespace std;int flag1[20],flag2[20],n;int l,v,ls,ans;int check_l(int ln){    int len = 0;    while(ln)    {        int r = ln%10
;        if(flag1[r])return 0;        flag1[r] = 1;        ln/=10;        len++;    }    ls = 9-len;    return 1;}int judge(int ln){    int len = 0;    memcpy(flag2,flag1,sizeof(flag2));    while(ln)    {        int r = ln%10;        if(flag2[r])return 0;        flag2[r] = 1;        ln/=10;        len++;    }    return len;}void dfs(int len,int x){    if(len <= ls/2)    {        if(judge(v*x)==ls-len)            ans++;        for(int i = 1; i<10; i++)        {            if(flag1[i])continue;            flag1[i] = 1;            dfs(len+1,x*10+i);            flag1[i] = 0;        }    }}int main(){    cin >> n;    ans = 0;    for(l = 1; l<n; l++)    {        flag1[0] = 1;        if(check_l(l))        {            v = n-l;            dfs(0,0);        }        memset(flag1,0,sizeof(flag1));    }    cout << ans << endl;    return 0;}

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述