题目是要求判断一个4*4的数字华容道是否在120步内有解
判断是否有解可以依据三条定理直接判断:
1.阶数为奇数时,逆序为偶数,不用判断空缺方块的位置;
2.阶数为偶数,逆序数为偶数,空缺方块被打乱位置后所在的行数与空缺方块应该在的正确位置的行数的差值为偶数;
3.阶数为偶数,逆序数为奇数,空缺方块被打乱位置后所在的行数与空缺方块应该在的正确位置的行数的差值为奇数;
题目给出数字华容道为4阶,所以只用考虑第2,3点
题目要求120步内,4*4的华容道最多步数为105,所以只要判断是否有解即可
代码下面给出:
#include<stdio.h>
int main(){
int t;
int a[16];
while(~scanf("%d",&t)){
while(t--){
int sum = 0,add = 0;
for(int i = 0;i < 16;i++){
scanf("%d",&a[i]);
if(a[i] != 0){
for(int j = 0;j < i;j++){
if(a[j] > a[i])
sum++;
}
}
else if(a[i] == 0)
add = i / 4;
}
if(sum % 2 == 0 && (3 - add) % 2 == 0)
printf("Yes\n");
else if(sum % 2 == 1 && (3 - add) % 2 == 1)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}