移动玩具

https://loj.ac/problem/10031

题目描述

  在一个(4×4)的方格内,有若干个(1),每次可以交换(0、1)的位置,求最少多少步移成目标状态。

思路

  这道题和棋盘游戏似乎没有太大区别,只是(0、1)数量不确定,思路一样,本人就不在写了。(其实代码都一模一样)。

代码

#include <bits/stdc++.h>
using namespace std;
bool vis[70005];
int step[70005];
queue<int>q;
int main() 
{
    char s[5];
    int a=0,b=0;
    for(int i=1;i<=4;i++)
    {
        scanf(" %s",s);
        for(int j=0;j<4;j++)
            a=a*2+s[j]-'0';
    }
    for(int i=1;i<=4;i++)
    {
        scanf(" %s",s);
        for(int j=0;j<4;j++)
            b=b*2+s[j]-'0';
    }
    vis[a]=1;step[a]=0;
    q.push(a);
    int p;
    while(!q.empty())
    {
        int now=q.front();q.pop();
        if(now==b)
        {
            printf("%d",step[now]);
            break ;
        }
        for(int i=0;i<16;i++)
        {
            if(i%4&&(now&(1<<i))^(now&(1<<i-1))&&!vis[p=now^(1<<i)^(1<<i-1)])
            {
                vis[p]=1;
                step[p]=step[now]+1;
                q.push(p);
            }
            if(i<12&&(now&(1<<i))^(now&(1<<i+4))&&!vis[p=now^(1<<i)^(1<<i+4)])
            {
                vis[p]=1;
                step[p]=step[now]+1;
                q.push(p);
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/fangbozhen/p/11766857.html