题目见之前的日志。
在这之前曾经写过一道八数码的题目,所以条件反射的就想到了用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分钟就能解决,上个版本近百行代码我写了近一个小时才调试出来....看来写题写多了也会形成一种思维定式。
关于这个方法正确性的数学证明,不是一件容易的事,比较标准证明方法要涉及到线性代数中的逆序,组合数学中的置换群理论...这里就省去了。其实对于其必要性(可达状态的逆序奇偶性是相同的)是很容易证明的,关键在于充分性的证明。