题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6620、
题意:华容道有无解法
题解:
#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
const int maxn = 2e5+5;
using namespace std;
int c[30];
int lowbit(int a) {
return (-a)&a;
}
void update(int a) {
while(a<20) {
c[a]++;
a+=lowbit(a);
}
}
int query(int a) {
int ans=0;
while(a) {
ans+=c[a];
a-=lowbit(a);
}
return ans;
}
int a[19], b[19];
int main()
{
int T, n, sum = 0;
scanf("%d", &T);
while(T--) {
memset(c,0,sizeof(c));
int x, ans = 0, num=0;
for(int i=0;i<16;i++){
scanf("%d", &b[i]);
if(b[i])a[num++]=b[i];
else x=i;
}
for(int i = 0; i < 15;i++)
{
ans += (i - query(a[i]));
update(a[i]);
}
if(ans % 2 == 0){
int cnt = 4 - (x / 4 + 1);
if(cnt % 2 == 0){
printf("Yes\n");
}
else printf("No\n");
}
if(ans % 2 == 1){
int cnt = 4 - (x / 4 + 1);
if(cnt % 2 == 1){
printf("Yes\n");
}
else printf("No\n");
}
}
return 0;
}