记录编号 558849 评测结果 AAAAAAAAAA
题目名称 飞行员兄弟 最终得分 100
用户昵称 Gravataryrtiop 是否通过 通过
代码语言 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;
}