码迷,mamicode.com
首页 > 移动开发 > 详细

移动玩具

时间:2019-10-01 20:42:40      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:div   names   time   for   font   name   pop   题目   turn   

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;
}

 

移动玩具

标签:div   names   time   for   font   name   pop   题目   turn   

原文地址:https://www.cnblogs.com/fangbozhen/p/11615897.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!