主要是练位运算和BFS
思路就是改变一次的数和原数有一条边,用宽搜从开始数到所求数即可。
所求数有两种形式选择DIST少的那一组
另外记得用十进制写,位运算计算。
CODE如下
#include<iostream>
#include<algorithm>
#include<string>
#include<set>
#include<cmath>
#include<cstdio>
#include<vector>
#include<map>
#include<queue>
# define ll long long
# define sz(x) (int)(x).size()
# define all(x) (x).begin(),(x).end()
# define rep(i,k,n) for (int i=k;i<n;i++)
# define pb push_back
# define mp make_pair
# define INF (1>>29)
using namespace std;
queue<int > q;
int dist[1<<15];
int main()
{
//freopen("","r",stdin);
//freopen("","w",stdout);
int n,m;
cin>>n>>m;
int st=0;
rep(i,0,n)//转十进制
{
int x;
cin>>x;
st+=(x<<i);
}
int cur=0;
int f1=0;
int f2=0;
int d=0;
rep(i,0,m)//转二进制转十进制
{
int x;
cin>>x;
rep(j,0,x)
{
f1+=(d<<cur);
f2+=((1-d)<<cur);
cur++;
}
d=1-d;
}
rep(i,0,1<<15)
{
dist[i]=-1;
}
q.push(st);
dist[st]=0;//BFS
while(!q.empty())
{
int mask=q.front();
q.pop();
rep(i,0,n-1)
{
if ((mask&(1<<i))&&!(mask&(1<<(i+1))))
{
int u=mask+(1<<i);
if (dist[u]<0)
{
dist[u]=dist[mask]+1;
q.push(u);
}
}
if (!(mask&(1<<(i)))&&(mask&(1<<(i+1))))
{
int u=mask-(1<<i);
if (dist[u]<0)
{
dist[u]=dist[mask]+1;
q.push(u);
}
}
}
}
int ans;
ans=min(dist[f1],dist[f2]);//判断
if (dist[f1]<0) ans=dist[f2];
if(dist[f2]<0) ans=dist[f1];
cout<<ans;
return 0;
}