这道题目是不能靠纯暴力的搜索解决的。因为每个位置都可能翻转或不翻转,那么可能的状态数有2^(N*M)个,暴力搜复杂度过高。
仔细观察它的性质可知,只要确定了某一行每个位置是否翻转,那么它相邻行每个位置只与已知行的一个数字相关,那么相邻行的翻转情况完全确定,再扩展开来,整个矩阵都会确定下来,因此只需枚举其中一行来搜索即可。
暴力搜索的代码:
#include <cmath>
#include<queue>
#include <cstring>
#include <cstdio>
#include <map>
#include <iostream>
#include <vector>
#include<cmath>
#define rep(i,a,n) for(int i=a;i<=n;i++)
using namespace std;
struct status
{
int Map[17][17];
int ope[17][17];
int step;
};
int main()
{
int m,n;
while(cin>>m>>n)
{
int ori[17][17];
rep(i,1,m)
{
rep(j,1,n)
{
cin>>ori[i][j];
}
}
queue<status>que;
while(!que.empty())que.pop();
status s;
rep(i,1,m)
{
rep(j,1,n)
{
s.Map[i][j]=ori[i][j];
s.ope[i][j]=0;
}
}
s.step=0;
que.push(s);
status fin;
int flag=0;
while(!que.empty())
{
cout<<1;
status now;
now=que.front();
que.pop();
rep(i,1,m)
{
rep(j,1,n)
{
if(now.Map[i][j]!=0)flag=1;
}
}
if(!flag)
{
fin=now;
break;
}
rep(i,1,m)
{
rep(j,1,n)
{
status t;
t=now;
t.Map[i][j]==0?1:0;
t.ope[i][j]++;
que.push(t);
}
}
}
rep(i,1,m)
{
rep(j,1,n)
{
cout<<fin.ope[i][j]<<' ';
}
cout<<endl;
}
}
}
这样的代码一定会超时。只需简单改动,只搜第一行即可。