/***首先叙述题意,
经过最小的次数使得原来的图全部变成‘-’
暴力枚举
*****/
#include<iostream>
#include<cstring>
using namespace std;
char mat[15][15];
int mmin = 100000;
struct Node
{
int x,y;
}pre[100], pre2[100];
bool solve(int x,int y)
{
if(x<0||x>=4||y<0||y>=4)return false;
}
void turn(int id)
{
int n = id / 4;
int m = id % 4;
for(int i=0;i<4;i++)
{
mat[n][i] == '+'?mat[n][i] = '-':mat[n][i] = '+';
if(i!=n)
mat[i][m] == '+'?mat[i][m] = '-':mat[i][m] = '+';
}
}
bool judge()
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
if(mat[i][j] != '-')
return false;
}
return true;
}
void dfs(int id,int cn)
{
if(judge())
{
if(cn < mmin){
mmin = cn;
memcpy(pre2, pre, sizeof(pre)); // 记录路径
}
return ;
}
if(id>=16)return ;
dfs(id+1,cn);
turn(id);
pre[cn + 1].x = id / 4 + 1; // 记录路径
pre[cn + 1].y = id % 4 + 1;
dfs(id+1,cn+1);
turn(id);
}
int main()
{
int n,m;
int icase;
char c;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
cin>>mat[i][j];
}
dfs(0,0);
cout<<mmin<<endl;
for(int i = 1; i <= mmin; i++){
cout << pre2[i].x << " " << pre2[i].y << endl;
}
}
poj 2965 dfs+保存路径
最新推荐文章于 2022-04-16 18:13:48 发布