P5461 赦免战俘
1.P5461 赦免战俘
赦免战俘
题目链接:P5461 赦免战俘 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目背景
借助反作弊系统,一些在月赛有抄袭作弊行为的选手被抓出来了!
题目描述
现有
给出
输入格式
一个整数
输出格式
样例 #1
样例输入 #1
3
样例输出 #1
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 1
0 0 0 0 1 1 1 1
0 0 0 1 0 0 0 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1
对于这道题来说,是一道比较水的题,但这是一道有多思路的题目。
可以有以下思路解决这个问题。
分治
分治的思想解决这个问题,用个
代码实现
//
// Created by G3429 on 2024/4/6.
//
#include <iostream>
#include <vector>
#include <cmath>
void fuc(int l, int r, int u, int d, std::vector<std::vector<int>> &nums) {
/* 当数组为一个元素时返回 */
if (l == r) {
return;
}
for (int i = l; i < (r + l) / 2 + 1; i++) {
for (int j = u; j < (d + u) / 2 + 1; j++) {
nums[i][j] = 0;
}
}
/* 左上 */
// fuc(l, (r + l) / 2, u, (d + u) / 2, nums);
/* 右上 */
fuc((r + l) / 2 + 1, r, u, (d + u) / 2, nums);
/* 左下 */
fuc(l, (r + l) / 2, (d + u) / 2 + 1, d, nums);
/* 右下 */
fuc((r + l) / 2 + 1, r, (d + u) / 2 + 1, d, nums);
}
int main() {
int n;
std::cin >> n;
int x = (int) pow(2, n);
std::vector<std::vector<int>> nums(x, std::vector<int>(x, 1));
fuc(0, x - 1, 0, x - 1, nums);
for (auto i: nums) {
for (auto j: i) {
std::cout << j << ' ';
}
std::cout << std::endl;
}
return 0;
}
找规律
这道题可以找规律来解决,观看一下图片,会发现两个规律,设 i,j分别代表二维数组的行和列。
- 通过位运算,( i | j )+ 1 == (1 << n) 时,元素的值为 1,其余值为 0。
- 通过递推,从第二行算起,每一个元素值为其 正上方 加上 右上方 的值 对 2 取模,如果数组用以为数组表示,则为(nums[i] = nums[i] + nums[i + 1])%2。这样表示是因为先输出了nums[i] 的值,再更新其值作为下一行的值。
位运算代码实现
#include<iostream>
using namespace std;
int n;
int main() {
cin >> n;
for (int i = 0; i < (1 << n); i++) {
for (int j = 0; j < (1 << n); j++) {
/* 三目运算符进行判断输出相应值 */
cout << ((i | j) + 1 != (1 << n) ? 0 : 1) << ' ';
}
cout << endl;
}
return 0;
}
递推代码实现
#include <iostream>
#include <vector>
int main() {
int n;
std::cin >> n;
std::vector<int> nums((1 << n) + 1, 0);
nums[(1 << n) - 1] = 1;
for (int j = 0; j < (1 << n); j++) {
for (int i = 0; i < (1 << n); i++) {
//输出
std::cout << nums[i] << ' ';
//为下一行输出更新值
nums[i] = (nums[i] + nums[i + 1]) % 2;
}
//换行
std::cout << std::endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理