原题链接:
1960. 闪烁 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/1962/
思路:
状态压缩+找环,不断枚举下一个状态,然后存一下每个状态的步数,如果出现重复就说明出现环了,注意别忘加上起点到出现环的步数,本题主要是训练状态压缩,具体细节见代码
Code:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e7+10;
int p[N];
long long n,k;
int get(int now)
{
int res=0;
for(int i=0;i<n;i++)//按题意模拟更改操作
{
int j=i-1;
if(j==-1) j=n-1;
int x=now>>i&1,y=now>>j&1;
res|=(x^y)<<i;
}
return res;
}
void print(int x)
{
for(int i=0;i<n;i++)
cout<<(x>>i&1)<<endl;
}
int main()
{
cin>>n>>k;
int star=0;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
star|=x<<i;
}
memset(p,-1,sizeof p);
p[star]=0;
int now=star;
int t=0;
for(int i=1;;i++)
{
now=get(now);
if(i==k)
{
print(now);
break;
}
if(p[now]!=-1)
{
t=i-p[now];
for(int j=0;j<(k-i)%t;j++) now=get(now);//还剩下的步数
print(now);
break;
}
else
p[now]=i;
}
return 0;
}
作者:机械之忍
链接:https://www.acwing.com/activity/content/code/content/2421483/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。