飞行员兄弟
思路:
这里一共有16
个格子,如果暴力的话也就是2^16
次方种排列组合。
这题和之前的开关不一样,这题是会影响到周围很多格子,而开关那题可以利用上方只改变一个的操作来解题,这题我想到的就是暴搜:
每一个格子都有两种选择 1.操作 2.不操作
我们遍历每一种情况,看能否找到答案即可。
#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;
}
加粗样式