AcWing 116 飞行员兄弟
大意:
- 4 x 4 翻转一个元素的话,顺带着所在行和列全跟着翻转;求全部翻转过来的步数和步骤
思路
- 如果枚举的话,2<<16次,复杂度还能够接受,可以枚举
- 枚举每个操作opt,每个操作opt的值转换成16位二进制,
- 对于每个opt,要移位16次,每次右移取最低位 ,当==1表示翻转
- 注意翻转i行j列的时候,(i,j)被翻转了两次,记得恢复
- 储存符合条件的操作的位置,用vector存
笔记
vector
1
2
3
4
5定义: vector<元素类型> 名称;例如: vector<PII> vec;
翻转: reverse(vec.begin(),vec.end());
大小: vec.size();
清空: vec.clear();
插入: vec.push_back(pi);for区间遍历 (C++11)
1
2
3for(auto i:vec){
cout<<i.x<<' '<<i.y<<endl;
}pair
1
2
3
4
typedef pair<int, int> PII;
PII pi; pi.first, pi.secondmemcpy
1
2void *memcpy(void *str1, const void *str2, size_t n)
str1:目的 str2:源 n:字节数二进制数i的第k位是否==1
1
i>>k&1
简洁版代码
1 |
|
废话版代码
1 |
|