- 关灯问题II
代码
- 2025-6-28 20:33:48 @
打表某个状态(01101)通过某个开关变为某个状态(10001)
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[105][15];
int g[1<<10][105];//开关状态i进行操作j后的开关状态
void init()
{
for(int i=0;i<(1<<10);i++)
{
bool s[11];
for(int j=0,t=i;j<11;j++,t>>=1)
s[j]=t&1;
for(int j=0;j<m;j++)
{
bool t[11];
for(int k=0;k<11;k++)t[k]=s[k];
for(int k=0;k<n;k++)
if(a[j][k]==1 && t[k]==1)t[k]=0;
else if(a[j][k]==-1 && t[k]==0)t[k]=1;
int r=0;
for(int k=0;k<11;k++)
if(t[k])r|=(1<<k);
g[i][j]=r;
}
}
}
int f[1<<10];
queue<pair<int,int> >q;
void bfs(int sx)
{
q.push({sx,0});
while(!q.empty())
{
int x=q.front().first,t=q.front().second;
q.pop();
f[x]=1;
if(!x)
{
cout<<t;
return;
}
for(int i=0;i<m;i++)
if(!f[g[x][i]])q.push({g[x][i],t+1});
}
cout<<-1;
}
signed main()
{
cin>>n>>m;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
init();
bfs((1<<n)-1);
return 0;
}
0 comments
No comments so far...
Information
- ID
- 403
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 9
- Tags
- # Submissions
- 13
- Accepted
- 3
- Uploaded By