开始没什么想法...一直想找到简单的方法不用遍历,或者减少遍历的东西和规则
然而并没有xswl
直接枚举加dfs加回溯,跑一边就完事了,记得最后是+1就好了
#pragma warning (disable:4996)
/*
coded by fgtmiao
time:2019/6/29
*/
#include<iostream>//dfs & 暴力
using namespace std;
int map[5][5];
pair<int, int>way[20];//临时的路径
pair<int, int>fin_way[20];//最终的路径
int minstep = 999;
void init()
{
char z;
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
cin >> z;
if (z == '+')
{
map[i][j] = 1;
}
else
{
map[i][j] = 0;
}
}
}
}
void turn(int i, int j)
{
for (int a = 0; a < 4; a++)
{
map[i][a] = 1 - map[i][a];
map[a][j] = 1 - map[a][j];
}
map[i][j] = 1 - map[i][j];
}
bool over()//游戏结束
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if (map[i][j] == 1)
{
return false;
}
}
}
return true;
}
void dfs(int num,int turn_num)//遍历了num个,翻转了turn_num次
{
if (over())
{
if (turn_num < minstep)
{
minstep = turn_num;
}
for (int i = 0; i < turn_num; i++)
{
fin_way[i] = way[i];
}
return;
}
if (num >= 16)return;//遍历数目超了
turn(num / 4, num % 4);//下一个的行和列
//记录当前路径
way[turn_num] = make_pair(num / 4+1, num % 4+1);//人家是从一开始的...
dfs(num + 1, turn_num + 1);
turn(num / 4, num % 4);//回溯
dfs(num + 1, turn_num);//不反转当前的
}
int main()
{
init();
dfs(0, 0);
printf("%d\n", minstep);
for (int i = 0; i < minstep; i++)
{
printf("%d %d\n", fin_way[i].first, fin_way[i].second);
}
return 0;
}