记录编号 |
558849 |
评测结果 |
AAAAAAAAAA |
题目名称 |
飞行员兄弟 |
最终得分 |
100 |
用户昵称 |
yrtiop |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.476 s |
提交时间 |
2021-01-29 22:50:42 |
内存使用 |
2.23 MiB |
显示代码纯文本
//本来以为要用递推,暴力不行
//结果还真能用暴力过hhh
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <utility>
using namespace std;
const int n = 4;
typedef pair<int,int> pa;
char g[5][5],s[5][5];
int lg[1 << 16];
int lowbit(int x) {
return x & (~ x + 1);
}
char readchar() {
char c = getchar();
while(c != '-'&&c != '+')c = getchar();
return c;
}
void change(int x,int y) {
if(g[x][y] == '-')g[x][y] = '+';
else g[x][y] = '-';
}
pa get(int x) {
++ x;
int a = x / n,b = x - n * a;
if(!b) {
-- a;
b = n;
}
return make_pair(a + 1 , b);
}
void turn(int x,int y) {
for(int i = 1;i <= n;++ i) {
change(x , i);
change(i , y);
}
change(x , y);
return ;
}
bool resc() {
for(int i = 1;i <= n;++ i) {
for(int j = 1;j <= n;++ j) {
if(g[i][j] == '+')return false;
}
}
return true;
}
int main() {
freopen("far.in","r",stdin);
freopen("far.out","w",stdout);
for(int i = 1;i <= n;++ i) {
for(int j = 1;j <= n;++ j) {
g[i][j] = readchar();
}
}
// puts("-----------------");
// for(int i = 1;i <= n;++ i) {
// for(int j = 1;j <= n;++ j) {
// putchar(g[i][j]);
// }
// putchar('\n');
// }
int mx = 16,best = (1 << 16) - 1;
for(int i = 1;i <= 15;++ i) {
lg[(1 << i)] = lg[1 << (i - 1)] + 1;
}
// for(int i = 0;i <= 15;++ i) {
// pa p = get(i);
// }
for(int i = 0;i <= (1 << 16) - 1;++ i) {
int cnt = 0;
memcpy(s , g , sizeof(g));
for(int j = 0;(1 << j) <= i;++ j) {
if(i >> j & 1) {
++ cnt;
pa p = get(j);
turn(p.first , p.second);
}
}
// while(x) {
// int pos = lowbit(x);
// x -= pos;
// ++ cnt;
// pos = lg[pos];
// pa p = get(pos);
// turn(p.first , p.second);
// }
if(resc()) {
if(mx > cnt) {
mx = cnt;
best = i;
}
if(mx == cnt) {
if(i < best) {
best = i;
}
}
}
// for(int j = 0;(1 << j) <= i;++ j) {
// if(i & (1 << j)) {
//// ++ cnt;
// pa p = get(j);
// turn(p.first , p.second);
// }
// }
// x = i;
// while(x) {
// int pos = lowbit(x);
// x -= pos;
// pos = lg[pos];
// pa p = get(pos);
// turn(p.first , p.second);
// }
memcpy(g , s , sizeof(s));
}
printf("%d\n",mx);
for(int i = 0;i <= 15;++ i) {
if(best & (1 << i)) {
pa p = get(i);
printf("%d %d\n",p.first,p.second);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}