題目見之前的日誌。
在這之前曾經寫過一道八數碼的題目,所以條件反射的就想到了用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分鐘就能解決,上個版本近百行代碼我寫了近一個小時才調試出來....看來寫題寫多了也會形成一種思維定式。
關於這個方法正確性的數學證明,不是一件容易的事,比較標準證明方法要涉及到線性代數中的逆序,組合數學中的置換羣理論...這裏就省去了。其實對於其必要性(可達狀態的逆序奇偶性是相同的)是很容易證明的,關鍵在於充分性的證明。