本文共 2023 字,大约阅读时间需要 6 分钟。
#includeusing namespace std;int n, kind = 0;int m1[10000][10], m2[10];void rec(int, int);int main(){ cin >> n; if (n > 30 || n < 10) //直接得答案 { cout << 0 << endl; return 0; } rec(0, 0); cout << kind << endl; for (int j = 0; j < kind; j++) { for (int i = 0; i < 10; i++) cout << m1[j][i] << " "; cout << endl; } return 0;}void rec(int total, int depth) //10-30时暴力深搜 { if (depth == 10) { if (total == n) { for (int j = 0; j < 10; j++) m1[kind][j] = m2[j]; kind++; } } else if (total >= n) return; else { for (int i = 1;i <= 3; i++) { m2[depth] = i; rec(total+i, depth+1); } }}
/**打靶问题:一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能性有多少?思路:这道题的思路与字符串的组合很像,用递归解决。一次射击有11种可能,命中1环至10环,或脱靶。*/#include#include #include #include #include using namespace std;//函数功能 : 求解number次打中sum环的种数//函数参数 : number为打靶次数,sum为需要命中的环数,result用来保存中间结果,total记录种数void ShootProblem_Solution(int number, int sum, vector &result, int &total){ if (sum < 0 || number * 10 < sum) //加number * 10 < sum非常重要,它可以减少大量的递归,类似剪枝操作 { return; } if (number == 1) //最后一枪 { if (sum <= 10) //如果剩余环数小于10,只要最后一枪打sum环就可以了 { for (unsigned i = 0; i < result.size(); i++) { cout << result[i] << ' '; } cout << sum << endl; total++; return; } else { return; } } for (unsigned i = 0; i <= 10; i++) //命中0-10环 { result.push_back(i); ShootProblem_Solution(number-1, sum-i, result, total); //针对剩余环数递归求解 result.pop_back(); }}void ShootProblem(int number, int sum){ int total = 0; vector result; ShootProblem_Solution(number, sum, result, total); cout<<"total nums = "< <
国际象棋中的皇后,可以横向、纵向、斜向移动。如何在一个8*8的棋盘上放置8个皇后,使得任意两个皇后都不在同一条横线、竖线、斜线方向上?
下面这个链接给出了易懂的讲解,为java语言描述: 下面是C++语言描述的代码:转载地址:http://fvtai.baihongyu.com/