
2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 3 1 2 0 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 3 0 2 1 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
N Y
题目大意:
解题思路:
给定24个数的位置如图,现在给你24个数,0表示空格,问你是否能由起始位置到终点位置。
解题代码:首先空格除外,八个角一定是一样的,然后其它的就得满足
(1)如果矩阵列数是奇数,逆序数必须同奇同偶,
(2)如果矩阵列数是偶数,逆序数加上0位置的行数之差必须同奇同偶。
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int a[30],b[30];
int spe[]={0,2,1,7,16,22,23,21};
int oth[]={3,4,5,6,8,9,10,11,12,13,14,15,17,18,19,20};
bool solve(){
if(a[0]==0) swap(a[0],a[3]);
if(a[2]==0) swap(a[2],a[3]);
if(a[1]==0) swap(a[1],a[6]);
if(a[7]==0) swap(a[7],a[6]);
if(a[16]==0) swap(a[16],a[17]);
if(a[22]==0) swap(a[22],a[17]);
if(a[23]==0) swap(a[23],a[20]);
if(a[21]==0) swap(a[21],a[20]);
if(b[0]==0) swap(b[0],b[3]);
if(b[2]==0) swap(b[2],b[3]);
if(b[1]==0) swap(b[1],b[6]);
if(b[7]==0) swap(b[7],b[6]);
if(b[16]==0) swap(b[16],b[17]);
if(b[22]==0) swap(b[22],b[17]);
if(b[23]==0) swap(b[23],b[20]);
if(b[21]==0) swap(b[21],b[20]);
for(int i=0;i<8;i++){
if(a[spe[i]]!=b[spe[i]]) return false;
}
int posx=-1,posy=-1,nx=0,ny=0;
vector <int> va,vb;
for(int i=0;i<16;i++){
int x=a[oth[i]],y=b[oth[i]];
if(x==0) posx=i/4+1;
else va.push_back(x);
if(y==0) posy=i/4+1;
else vb.push_back(y);
}
for(int i=0;i<va.size();i++)
for(int j=i+1;j<va.size();j++)
if(va[i]>va[j]) nx++;
for(int i=0;i<vb.size();i++)
for(int j=i+1;j<vb.size();j++)
if(vb[i]>vb[j]) ny++;
if(abs(posx-posy+nx-ny)&1) return false;
else return true;
}
int main(){
int T;
scanf("%d",&T);
while(T-- >0){
for(int i=0;i<24;i++) scanf("%d",&a[i]);
for(int i=0;i<24;i++) scanf("%d",&b[i]);
if( solve() ) printf("N\n");
else printf("Y\n");
}
return 0;
}
HDU 4021 24 Puzzle (拼图),布布扣,bubuko.com
原文:http://blog.csdn.net/a1061747415/article/details/38589063