藍橋杯 帶分數 DFS
阿新 • • 發佈:2018-11-12
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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;}