dfs
1.简单模板:
https://www.cnblogs.com/OctoptusLian/p/7429645.html(啊哈磊)
2.题目:蓝桥杯真题<带分数>
问题描述
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
解答1:
代码:
#include<bits/stdc++.h> using namespace std; int n,num,p[10]={0}; int inc(int x){ for(int i=0;i<9;i++) if(x==p[i])return 1; return 0; } int tonum(int x,int y){ int res=0; for(int i=0;i<y;i++) res=res*10+p[x+i]; return res; } void put(){ int num1,num2,num3; for(int i=1;i<=7;i++) for(int j=1;j<=8-i;j++){ //j代表从i开始的j个数 if(j<9-i-j)continue; else{ num1=tonum(0,i); num2=tonum(i,j); num3=tonum(i+j,9-i-j); if(num2%num3==0 && num1+num2/num3==n)num++; } } } void dfs(int u){ if(u==9){ put();return;} for(int i=1;i<=9;i++) if(!inc(i)){ p[u]=i; dfs(u+1); p[u]=0; } } int main() { scanf("%d",&n); dfs(0); printf("%d\n",num); }