用户:
受弱的喵娘の极致的艾莲厨查看:12 回复:8 评论:12 创建时间:2024-06-30T22:08:22

一道c++的题目喵~
「Origin、拾柒」说明
现有 2^nx2^nns10)名作整者站成一个正方形方阵等候 kkksc03 的发落。kkksc03 决定教免一些作整者。他将正方形先
阵均分为 4个更小的正方形矩阵,每个更小的矩阵的边长是原矩阵的一半。其中左上角那一个矩阵的所有作整者都将得
到教免,剩下3个小矩阵中,每一个矩阵继续分为 4 个更小的矩阵,然后通过同样的方式教免作整者....直到矩阵无法
再分下去为止。所有没有被赦免的作弊者都将被处以棕名处罚
给出n,请输出每名作弊者的命运,其中 0代表被赦免,1代表不被救免。
输入格式
个整数n。
输出格式
2^nx2^n的01矩阵,代表每个人是否被赦免。数字之间有一个空格
嗯……
点赞0
评论
「Origin、拾柒」以下是一个C++程序,用于生成并打印出符合给定条件的01矩阵。该程序使用递归方法将大矩阵划分为更小的矩阵,并标记左上角矩阵的作弊者为被赦免。
cpp
#include <iostream>
#include <vector>
using namespace std;
// 递归函数来填充矩阵
void fillMatrix(vector<vector<int>>& matrix, int n, int startRow, int startCol) {
// 递归终止条件
if (n == 1) {
// 当n为1时,只有一个元素,位于左上角,标记为0(被赦免)
matrix[startRow][startCol] = 0;
return;
}
// 否则,将矩阵划分为四个更小的矩阵
int halfSize = n / 2;
// 左上角矩阵
fillMatrix(matrix, halfSize, startRow, startCol);
// 右上角矩阵
fillMatrix(matrix, halfSize, startRow, startCol + halfSize);
// 左下角矩阵
fillMatrix(matrix, halfSize, startRow + halfSize, startCol);
// 右下角矩阵(无需特别标记,因为它们默认为1)
// 剩下的部分(即除了左上角矩阵)保持为1(不被赦免)
// 因为递归调用时已经处理了左上角,所以我们只需要确保其他地方是1
for (int i = startRow; i < startRow + halfSize; ++i) {
for (int j = startCol + halfSize; j < startCol + n; ++j) {
matrix[i][j] = 1;
}
}
for (int i = startRow + halfSize; i < startRow + n; ++i) {
for (int j = startCol; j < startCol + n; ++j) {
matrix[i][j] = 1;
}
}
}
// 主函数
int main() {
int n;
cin >> n; // 输入n
// 初始化2^n x 2^n的矩阵,所有元素默认为1(不被赦免)
vector<vector<int>> matrix(1 << n, vector<int>(1 << n, 1));
// 调用递归函数填充矩阵
fillMatrix(matrix, 1 << n, 0, 0);
// 打印矩阵
for (const auto& row : matrix) {
for (int num : row) {
cout << num << " ";
}
cout << endl;
}
return 0;
}
请注意,由于n表示的是矩阵的边长是以2为底数的指数,所以当我们初始化矩阵大小时,我们使用1 << n(即2的n次方)来得到正确的矩阵大小。此外,由于矩阵的初始所有元素都被设为1(表示不被赦免),因此在递归函数中我们只需要关心如何设置左上角矩阵的值为0,而不需要显式地将其他部分设为1(因为它们已经是1了)。
点赞0
评论
「Origin、拾柒」为了解决这个问题,我们可以编写一个C++程序,该程序将递归地模拟题目中描述的矩阵分割和赦免过程。在每次递归调用中,我们将当前矩阵的左上角部分设置为0(表示赦免),然后对于剩下的三个区域(右上、左下、右下),我们递归地调用该函数并将它们继续分割。
#include <iostream>
#include <vector>
// 递归函数,用于填充矩阵
void fillMatrix(std::vector<std::vector<int>>& matrix, int size, int startRow, int startCol) {
if (size == 1) {
// 递归结束条件,直接设置左上角为0
matrix[startRow][startCol] = 0;
return;
}
// 设置左上角子矩阵为0
for (int i = startRow; i < startRow + size; ++i) {
for (int j = startCol; j < startCol + size; ++j) {
matrix[i][j] = 0;
}
}
// 递归处理剩下的三个子矩阵
fillMatrix(matrix, size / 2, startRow, startCol + size / 2); // 右上角
fillMatrix(matrix, size / 2, startRow + size / 2, startCol); // 左下角
fillMatrix(matrix, size / 2, startRow + size / 2, startCol + size / 2); // 右下角
// 对于剩下的三个子矩阵,将非左上角部分设置为1(表示不被赦免)
for (int i = startRow; i < startRow + size; ++i) {
for (int j = startCol + size / 2; j < startCol + size; ++j) {
if (i == startRow || i == startRow + size - 1) continue; // 跳过左上角和右下角边界
matrix[i][j] = 1;
}
}
for (int i = startRow + size / 2; i < startRow + size; ++i) {
for (int j = startCol; j < startCol + size; ++j) {
if (j == startCol || j == startCol + size - 1) continue; // 跳过左上角和左下角边界
matrix[i][j] = 1;
}
}
}
int main() {
int n;
std::cin >> n;
// 初始化矩阵,大小为2^n x 2^n
std::vector<std::vector<int>> matrix(1 << n, std::vector<int>(1 << n, -1)); // 初始化为-1表示未设置
// 调用递归函数填充矩阵
fillMatrix(matrix, 1 << n, 0, 0);
// 输出矩阵
for (const auto& row : matrix) {
for (int val : row) {
std::cout << val << " ";
}
std::cout << std::endl;
}
return 0;
}
请注意,我们在这里使用了1 << n来计算2的n次方,并用它来初始化矩阵的大小。-1用作矩阵的初始值,以表示尚未设置的值。在递归函数fillMatrix中,我们首先检查递归的结束条件(即size == 1),然后设置当前子矩阵的左上角为0,并递归地处理剩下的三个子矩阵。在递归调用之后,我们遍历剩下的三个子矩阵并将非左上角部分设置为1。
运行此程序并输入3将产生所需的输出。
点赞3
评论
lgz1111不会c++,写了个python的
n=int(input())
list=[]
for i in range(2**n**2):
list.append(1)
def xy_num(hang,lie):
global n
return 2 ** n * hang + lie
def shemian_square(first_hang,first_lie,bianchang):
if bianchang >= 1:
#print (first_hang,first_lie,bianchang)
global n,list
square_list=[]
a=first_hang
for a in range(a,a+bianchang) :
b=first_lie
for b in range(b,b+bianchang):
square_list.append(xy_num(a,b))
for i in square_list:
list[i]=0
shemian_square(first_hang+bianchang,first_lie,int(bianchang/2))
shemian_square(first_hang,first_lie+bianchang,int(bianchang/2))
shemian_square(first_hang+bianchang,first_lie+bianchang,int(bianchang/2))
shemian_square(0,0,2**(n-1))
#打印
count=0
for i in range (2**n):
for a in range (2**n):
print(list[count],end=" ")
count+=1
print("")
嗨,根本不会前几个说的二维数组,只能用在kitten4用惯的用列表的老办法凑数了
点赞0
评论
该用户不再实名上网《kkksc03》《h t t p s : / / w w w . l u o g u . c o m . c n / 》《⚡传⚡说⚡中⚡没⚡有⚡一⚡个⚡猫⚡站⚡人⚡找⚡不⚡到⚡题⚡解⚡》🤓🤓🤓👌👌👌
点赞0
评论