数字华容道类数码问题 之 HDU - 6620——Just an Old Puzzle

问题虫洞:C - Just an Old Puzzle HDU - 6620

 

黑洞内窥:

给你一个4x4的数字华容道,,问你可不可以在120步之内还原。。。。。

 

思维光年:

队友老是觉得可以爆搜这道题,,,,

于是我们现场下载了一个<数字华容道>的app玩了一下,,

发现游戏里的华容道总是有解的,我也很绝望啊。

 

正确而富有理性的求解:

序列从左往右拿起。。

即,当逆序对个数的奇偶性完成时 空格所在行和初始时 空格所在行的的差奇偶性相同时才有解

 

ACcode:

//#include<bits/stdc++.h>
#include  <stdio.h>
#include <iostream>
#include<algorithm>
#include      <map>
#include      <set>
#include   <vector>
#include    <queue>
#include    <stack>
#include <stdlib.h>
#include  <cstring>
#include <string.h>
#include   <string>
#include   <math.h>
#include  <sstream>
using namespace std;
typedef long long ll;
#define MAXN 10005
#define INF 0x3f3f3f3f//将近ll类型最大数的一半,而且乘2不会爆ll
const ll mod = 1000000007;

int a[20];
int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        int c, d=4, ans=0;
        for(int i=1; i<=16; ++i)
        {
            scanf("%d", &a[i]);
            if(a[i] == 0)
                c = (i-1)/4 + 1;//空格所在行
        }
        for(int i=1; i<=16; ++i)
        {
            if(a[i])
                for(int j=i+1; j<=16; ++j)
                    if(a[j])
                        if(a[i] > a[j])    //初始逆序数为ans,完成时为0
                            ans++;
        }
        if(ans%2 == (d-c)%2) puts("Yes");
        else puts("No");

    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值