1,计算组合数
#include
using namespace std;
int a[20], flag[20], n;
void dfs(int x) {
if (x == n + 1) {
for (int i = 1; i <= n; i++)cout << a[i] << " ";
cout << endl;
return;
}
for (int i = 1; i <= n; i++) {
if (flag[i] == 0) {
a[x] = i;
flag[i] = 1;
dfs(x + 1);
flag[i] = 0;
}
}
return;
}
int main() {
cin >> n;
dfs(1);
return 0;
}
2,在上题基础上增加了排序的DFS方法
#include
using namespace std;
int a[20], flag[20], n, num_len, c = 0;
bool judge() {
int tmp = n;
for (int i = 1; i <= num_len; i++) {
if (a[i] != tmp / (int)pow(10, num_len - i))return 0;
tmp -= (tmp / (int)pow(10, num_len - i))*pow(10, num_len - i);
}
return 1;
}
void dfs(int x) {
if (x == num_len + 1) {
c++;
if(judge())cout << c << endl;
return;
}
for (int i = 1; i <= num_len; i++) {
if (flag[i] == 0) {
a[x] = i;
flag[i] = 1;
dfs(x + 1);
flag[i] = 0;
}
}
return;
}
int main() {
cin >> num_len>>n;
dfs(1);
return 0;
}
3,进制类,这里以检查金币为例
蒜场生产金币的设备出了问题,使得最近生产的 10 批金币的重量出现了波动:本来金币的标准重量是 10 克,但现在有的可能是 11 克,有的可能 9 克,也有可能是 10克。
现在只知道同一批金币的重量是相同的,你的任务是要把每批的单枚金币的重量找出来。
你有一个电子秤,但只允许称量一次!
你从第 1 批中取 1 枚金币,从第 2 批取 3 枚,... 从第 i 批取 3^{i - 1}枚,...,从第 10 批取 3^9 枚,总共 29524 枚金币。将这 29524 枚金币放在电子秤上,得到了总重量。
这样就可以计算出来每一批金币的重量了,但是现在需要你写一个程序帮忙计算。
输入包含一个 6 位的正整数 W(265716≤W≤324764),表示 29524 枚金币的总重量。
输出一共 10 行,第 i 行代表第 i 批金币的单枚重量。
#include
using namespace std;
int ans[10],n,c=0,i=0;
void solve(int sum){
if(sum==n){
for(int i=0;i<10;i++)cout<>n;
solve(0);
return 0;
}
4,红与黑
蒜厂有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。
请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
输入格式
第一行是两个整数 W 和 H,分别表示 x 方向和 y 方向瓷砖的数量。W 和 H 都不超过 2020。
在接下来的 H 行中,每行包括 W 个字符。每个字符表示一块瓷砖的颜色,规则如下
1)'.':黑色的瓷砖;
2)'#':红色的瓷砖;
3)'@':黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
输出格式
输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。
#include
using namespace std;
int n,m;int c=0;
char f[20][21];
void dfs(int x,int y)
{
f[x][y]='#';
for(int dx=-1;dx<=1;dx++)
{
for(int dy=-1;dy<=1;dy++)
{
int nx=x+dx;int ny=y+dy;
if(nx>=0&&nx=0&&f[nx][y]=='.'){dfs(nx,y);c++;}
else if(ny>=0&&ny>n>>m;
for(int i=0;i>f[i][j];
for(int i=0;i
5,打印数字圆环1到n,相邻数和为素数
#include
#include
using namespace std;
int a[10], flag[10], n = 0;
bool is_prime(int n) {
if (n == 1)return 0;
for (int i = 2; i <= sqrt(n); i++)if (n % i == 0)return 0;
return 1;
}
bool check() {
if(!is_prime(a[0]+a[n-1]))return 0;
for (int i = 0; i < n - 1; i++)if (!is_prime(a[i] + a[i + 1]))return 0;
return 1;
}
void dfs(int x) {
if (x == n + 1) {
if (check()) {
for (int i = 0; i < n; i++)cout << a[i] << endl;
cout << endl;
}
return;
}
for (int i = 1; i <= n; i++) {
if (flag[i - 1] == 0) {
a[x - 1] = i;
flag[i - 1] = 1;
dfs(x + 1);
flag[i - 1] = 0;
}
}
return;
}
int main() {
cin >> n;
dfs(1);
return 0;
}