飞行员兄弟
思路:
这里一共有16
个格子,如果暴力的话也就是2^16
次方种排列组合。
这题和之前的开关不一样,这题是会影响到周围很多格子,而开关那题可以利用上方只改变一个的操作来解题,这题我想到的就是暴搜:
每一个格子都有两种选择 1.操作 2.不操作
我们遍历每一种情况,看能否找到答案即可。
cpp
#include<iostream>
#include<vector>
using namespace std;
vector<pair<int,int>>res;
vector<pair<int,int>>now;
char g[5][5];
void turn_one(int x, int y)
{
if (g[x][y] == '+') g[x][y] = '-';
else g[x][y] = '+';
}
void turn_all(int x, int y)
{
for (int i = 0; i < 4; i++)
{
turn_one(x, i);
turn_one(i, y);
}
turn_one(x, y);
}
bool Check()
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if (g[i][j] == '+') return false;
}
}
return true;
}
void dfs(int x,int y)
{
//递归出口
if(x==3&&y==4)
{
if(Check())
{
//判断是否需要更新路径
if(res.empty()||(res.size()<now.size()))
{
res=now;
}
}
return;
}
//控制边界
if(y==4)
{
x+=1;
y=0;
}
//开始递归
//1.操作
now.push_back({x,y});
turn_all(x,y);
dfs(x,y+1);
turn_all(x,y);
now.pop_back();
//2.不操作
dfs(x,y+1);
}
int main(void)
{
for(int i=0;i<4;i++) cin>>g[i];
dfs(0,0);
printf("%d\n",res.size());
//输出答案
for(int i=0;i<res.size();i++)
{
printf("%d %d\n",res[i].first+1,res[i].second+1);
}
return 0;
}
加粗样式