http://codeforces.com/gym/100803/attachments A题 Bit String Reordering

主要是练位运算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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值