该题数据较小,想到状态压缩
不可能则输出-1,想到bfs队空后的输出状态
每个状态都是由上个状态到达的
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int n, m, a[111][11];
bool vis[1<<11];
typedef struct pii {int x, s;}pii;//x:状态, s:当前步数
queue <pii> q;
int bfs()
{
pii u, v;
int i, j, t;
while(!q.empty())
{
u = q.front();
q.pop();
v.s = u.s + 1;
for(i = 0; i < m; ++i)//枚举灯
{
t = u.x;
for(j = 0; j < n; ++j)//用灯i分别操作t状态的n盏灯
if((a[i][j]==1 && t&(1<<j)) || (a[i][j]==-1 && !(t&(1<<j))))
t ^= (1<<j);
if(!t) return v.s;
if(vis[t]) continue;
v.x = t;
vis[t] = 1;
q.push(v);
}
}
return -1;
}
int main()
{
scanf("%d %d", &n, &m);
for(int i = 0; i < m; ++i)
for(int j = 0; j < n; ++j)
scanf("%d", &a[i][j]);
pii p;
p.x = (1<<n)-1;
p.s = 0;
q.push(p);
memset(vis, 0, sizeof(vis));
vis[p.x] = 1;
int ans = bfs();
printf("%d\n", ans);
return 0;
}