竞赛第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分钟就能解决,上个版本近百行代码我写了近一个小时才调试出来....看来写题写多了也会形成一种思维定式。


关于这个方法正确性的数学证明,不是一件容易的事,比较标准证明方法要涉及到线性代数中的逆序,组合数学中的置换群理论...这里就省去了。其实对于其必要性(可达状态的逆序奇偶性是相同的)是很容易证明的,关键在于充分性的证明。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章