競賽第10題數學解法


題目見之前的日誌。


在這之前曾經寫過一道八數碼的題目,所以條件反射的就想到了用BFS(廣度優先搜索),其實這題這樣解是弄複雜了,題目只要求判斷解的存在性,是有純數學解法的。經過研究,發現對於所有可達的狀態排列(除去*號),可達狀態的逆序奇偶性是相同的,而逆序奇偶性相同的狀態肯定是可達的,也就是說,逆序奇偶性是可達性的充分必要條件。

代碼如下:

#include<stdio.h>
int main()
{
	int n,i,j,sum;
	char str[7];	
	scanf("%d",&n);
	while(n--)
	{
		scanf("%s",str);
		for(i=0,sum=1;i<6;i++)
		{
			if(str[i]=='*') continue;
			for(j=i+1;j<6;j++)
			{
				if(str[j]=='*') continue;
				if(str[j]<str[i]) sum++;
			}
		}
		printf("%d\n",sum%2);
	}
	return 0;
}


總共20多行代碼就解決了,估計6分鐘就能解決,上個版本近百行代碼我寫了近一個小時才調試出來....看來寫題寫多了也會形成一種思維定式。


關於這個方法正確性的數學證明,不是一件容易的事,比較標準證明方法要涉及到線性代數中的逆序,組合數學中的置換羣理論...這裏就省去了。其實對於其必要性(可達狀態的逆序奇偶性是相同的)是很容易證明的,關鍵在於充分性的證明。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章