p1092蟲食算
這道題的思想並不複雜,可是難點在於各種玄學剪枝。在仔細研究了題解大佬的剪枝原理後終於氵了過去。
先上**:
key陣列儲存的是譯出的對照表,s1,s2,s3儲存的是題目給定的算式#include#include#includeusing namespace std;
const int maxn=100;
int n;
char s1[maxn],s2[maxn],s3[maxn];
int key[maxn],order[maxn],used[maxn];
int cnt=0,a,b,c;
void getorder(int x)
}bool wrong()
} return false;
}bool ok()
return true;
}void print() }}
int main()
for(int i='a';i<='z';i++)
memset(used,0,sizeof(used));
dfs(0);
return 0;
}
重點是order陣列和剪枝條件wrong()
先看剪枝條件吧:
1.如果最高位加起來大於n顯然需要剪枝
2.如果某一豎列已經確定,且加(a+b)%n!=c && (a+b+1)%n!=c需要剪枝,因為這是加法運算,所以進製只能為1
但是在確定搜尋順序的時候我們發現如果從a=0 b=1這樣沒有規律的暴力搜尋的話第二個剪枝條件只有到最後才能發揮作用,因為可能只有大部分的數字被確定下來這一豎列才能確定,那這樣前面的就功虧一簣了,所以為了解決這個問題我們加上order陣列,即按照order陣列的順序進行搜尋
order陣列的順序就是一豎列一豎列的搜尋,這樣只有前面的豎列都已經滿足那個簡單關係後才會進行後面的搜尋,所以會快很多。
因為最高位需要同時滿足上面兩個剪枝條件,所以從高位向地位搜尋效率更高!
雖然能理解,但是還是覺得自己做的話很難想到這麼多的條件。在分析問題的時候要按照問題的特性去分析,不要將自己侷限在某乙個小小的空間內。
題解 P1092 蟲食算
聽說正解是高斯消元吶,但是我不會 看到大家都寫了搜尋。一種實現很簡單的方法是列舉1 n的排列,判斷是否可行。我算了算時間複雜度 其實我不會算,就大概估計了一下 發現會超時。由於不會算複雜度,我對於這樣的暴搜能過50表示驚訝 o 如果按照豎式從右至左的順序搜,就可以邊搜邊判斷是否可行了。我寫得很麻煩,...
普及練習場 深度優先搜尋 P1092 蟲食算
題目描述 所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。現在,我們對問題做兩個限制 首先,我們只考慮加法的蟲食算。這裡的加法是n進製加法,算式中三個數都有n位,允許有前導的0。其次,蟲子把所有的數都啃光了,我們只知道哪些數字是相同的,我們將相同的數字用相...
P1092 蟲食算 題解(dfs 深度優先搜尋)
所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 43 9865 045 8468 6633 44445509678其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是55和33,第二行的數字是55。現在,我們對...