#include <iostream> using namespace std; const int max_size = 1 << 10; int res[max_size][max_size]; void recursive(int x, int y, int n, int t) { if (n == 0) { res[x][y] = t; return; } int step = 1 << (n - 1); recursive(x, y, n - 1, t); recursive(x, y + step, n - 1, t); recursive(x + step, y, n - 1, t); recursive(x + step, y + step, n - 1, !t); } int main() { int n = 0; cin >> n; recursive(0, 0, n, 0); int size = 1 << n; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { cout << res[i][j]; } puts(""); } return 0; }
时间: 2024-04-01 22:34:13 浏览: 109
这段代码实现了一个分形——Sierpinski 阵列。它的基本思想是:将一个正方形分成四个小正方形,然后在左上角、右上角和左下角的小正方形中分别填入和原来正方形相同的阵列,而在右下角的小正方形中填入和左上角的小正方形不同的阵列。如此递归下去,最终得到一个 Sierpinski 阵列。
具体来说,代码中的 recursive() 函数实现了递归过程。它的参数 x 和 y 表示当前正方形的左上角坐标,n 表示当前正方形的边长,t 表示当前正方形的填充值(0 或 1)。当 n 等于 0 时,递归结束,将最终的填充值写入 res 数组中。否则,递归调用自身四次,分别处理四个小正方形。
最后,主函数中读入参数 n,调用 recursive() 函数生成 Sierpinski 阵列,并将结果输出到标准输出流中。具体输出方式是,遍历 res 数组中的每个元素,将其打印出来,并在每行末尾加上一个换行符。
需要注意的是,代码中使用了位运算来计算 2 的幂次方,例如 1 << (n - 1) 表示 2^(n-1)。此外,为了方便输出,代码中使用了 puts("") 函数来输出一个空行。
相关问题
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 1010; int n,m; //n 表示物体个数,m 表示背包容量 int f[N][N]; int v[N], w[N]; //v[N], w[N] 分别表示每个物品的体积和价值 int main() { cin >> n >> m; for(int i=0; i<n; i++) { cin >> v[i] >> w[i]; } for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { f[i][j] = f[i-1][j]; if(j >= v[i]) f[i][j] = max(f[i][j], f[i-1][j-v[i]] + w[i]); } int res = 0; for(int i=0; i<=m; i++) res = max(res,f[n][i]); cout <<"总最大价值为:" << res << endl; return 0; }每行代码什么意思
这段代码实现了 0-1 背包问题的动态规划解法。 具体每行代码的意思如下:
1. `#include <iostream>`:头文件,用于输入输出。
2. `#include <cstring>`:头文件,用于字符串和数组的操作。
3. `#include <algorithm>`:头文件,用于算法库中的一些函数,比如 max() 函数。
4. `using namespace std;`:命名空间。
5. `const int N = 1010;`:定义常量 N,表示物品的个数或者背包的容量。
6. `int n,m;`:定义变量 n 和 m,分别表示物品的个数和背包的容量。
7. `int f[N][N];`:定义二维数组 f,表示前 i 个物品放入容量为 j 的背包中所能获得的最大价值。
8. `int v[N], w[N];`:定义两个一维数组 v 和 w,分别表示每个物品的体积和价值。
9. `cin >> n >> m;`:输入物品的个数和背包的容量。
10. `for(int i=0; i<n; i++) { cin >> v[i] >> w[i]; }`:输入每个物品的体积和价值。
11. `for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { f[i][j] = f[i-1][j]; if(j >= v[i]) f[i][j] = max(f[i][j], f[i-1][j-v[i]] + w[i]); }`:动态规划求解最大价值,其中 f[i][j] 表示前 i 个物品放入容量为 j 的背包中所能获得的最大价值,v[i] 和 w[i] 分别表示第 i 个物品的体积和价值,max() 函数用于求解最大值。
12. `int res = 0;`:定义变量 res,表示最大价值。
13. `for(int i=0; i<=m; i++) res = max(res,f[n][i]);`:在所有容量为 0 到 m 的背包中找到最大价值。
14. `cout <<"总最大价值为:" << res << endl;`:输出总最大价值。
添加注释 #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int INF = 1e9; int profit[4][7] = { {0, 0, 0, 0, 0, 0, 0}, {0, 3, 5, 6, 7, 6, 5}, {0, 4, 6, 7, 8, 9, 10}, {0, 2, 5, 9, 8, 8, 7}}; int dp[10][10][10]; int main() { memset(dp, 0, sizeof(dp)); for (int i = 0; i < 7; i++) for (int j = 0; j < 7; j++) for (int k = 0; k < 7; k++) { dp[i][j][k] = max(dp[i][j][k], profit[1][i] + profit[2][j] + profit[3][k]); } int n = 0; cin >> n; int l = -1, r = -1, m = -1, res = -1; for (int i = 0; i < 7; i++) for (int j = 0; j < 7; j++) for (int k = 0; k < 7; k++) if (i + j + k == n && res < dp[i][j][k]) { res = dp[i][j][k]; l = i; r = j; m = k; } printf("%d %d %d\n", l, r, m); cout << "你好" << endl; printf("%d", res); return
下面是添加注释后的代码:
```c++
// 引入头文件
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 1e9;
// 定义利润数组
int profit[4][7] = {
{0, 0, 0, 0, 0, 0, 0},
{0, 3, 5, 6, 7, 6, 5},
{0, 4, 6, 7, 8, 9, 10},
{0, 2, 5, 9, 8, 8, 7}
};
// 定义动态规划数组
int dp[10][10][10];
int main() {
// 初始化动态规划数组
memset(dp, 0, sizeof(dp));
for (int i = 0; i < 7; i++)
for (int j = 0; j < 7; j++)
for (int k = 0; k < 7; k++) {
dp[i][j][k] = max(dp[i][j][k], profit[1][i] + profit[2][j] + profit[3][k]);
}
// 读入n值
int n = 0;
cin >> n;
// 计算最大利润
int l = -1, r = -1, m = -1, res = -1;
for (int i = 0; i < 7; i++)
for (int j = 0; j < 7; j++)
for (int k = 0; k < 7; k++)
if (i + j + k == n && res < dp[i][j][k]) {
res = dp[i][j][k];
l = i;
r = j;
m = k;
}
// 输出结果
printf("%d %d %d\n", l, r, m);
cout << "你好" << endl;
printf("%d", res);
return 0;
}
```
阅读全文