【2019杭電多校訓練賽】HDU6620 / 1007-Just an Old Puzzle 題解

這裏涉及到三個定理,數字華容道,必然有解,只存在於如下3個細分情形:

  1. 若格子列數爲奇數,則逆序數必須爲偶數;
  2. 若格子列數爲偶數,且逆序數爲偶數,則當前空格所在行數與初始空格所在行數的差爲偶數;
  3. 若格子列數爲偶數,且逆序數爲奇數,則當前空格所在行數與初始空格所在行數的差爲奇數。

首先,4*4的方格若有解則步數一定在80步內,所以這題主要求的是華容道是否有解
華容道有解的情況結合前面的三條定理,求逆序數

#include <bits/stdc++.h>
using namespace std;
int a[20];
int n;
int main( ) {
	int T;
	scanf("%d", &T);
	int flag, x, ans;
	while(T--) {
		ans = 0;
		for(int i = 1; i <= 16; i++) {
			scanf("%d", &a[i]);
			if(a[i] == 0) flag = i / 4 + (i % 4 != 0);//如果等於0,求出它在第幾行
			else {
				for(int j = 1; j < i; j++) {//求逆序對的個數
					if(a[j] == 0) continue;
					if(a[j] > a[i]) ans++;
				}
			}
		}
		printf((4-flag) % 2 == ans % 2 ? "Yes\n" : "No\n");//奇偶性相等
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章