知识点:思维,枚举
这个题就是其实就是暴力,带思维的暴力,分析题目的性质,然后高效一点的暴力,具体的方法就是枚举第一行是否开关,然后下一行是否开关由上一行决定,这里就用到了指数枚举和递推的思想,最后统计一下,
为什么得出上述的算法,那是对题目的性质分析之后得出的,首先每个点最多只能按一次,按两次和不按是等效的,其次就是假如有一个答案方案,那么这个方案里面谁先谁后按都是一样的,这样可以启发我们,一行一行的按,所以就有了枚举第一行,然后一行一行的递推,那么产生的情况就已经包含最优解了,从这些所有的情况里面找出最优解就行了,这个题还有个第二标尺是字典序,这个就是从左到右,从上到下比较就行了,
中间有个小插曲,我想用flag表示3种情况的,结果没有定义成int,定义成了bool,这显然就是错的,bool只能表示两种状态,这个错误浪费了20多分钟时间,要不是可以20分钟过了这个题的,
#include <bits/stdc++.h>
using namespace std;
const int N = 20;
int n, m, a[N][N], b[N][N], d[N][N], ans;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
vector<int> chosen;
void solve(int k) {
if (k == m + 1) {
for (int i = 1; i <= n;