生活随笔
收集整理的這篇文章主要介紹了
P1092虫食算-深度优先搜索+玄学剪枝
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
P1092蟲(chóng)食算
這道題的思想并不復(fù)雜,可是難點(diǎn)在于各種玄學(xué)剪枝。在仔細(xì)研究了題解大佬的剪枝原理后終于氵了過(guò)去。
先上代碼:
#include<cstdio>
#include<cstring>
#include<algorithm>
using 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)
{if(used[x]==0){used[x]=1;order[cnt++]=x;}
}bool wrong()
{if(key[s1[0]]+key[s2[0]]>=n) return true;for(int i=n-1;i--;i>=0){A=key[s1[i]]; B=key[s2[i]]; C=key[s3[i]];if(A==-1 || B==-1 || C==-1) continue;if((A+B)%n!=C && (A+B+1)%n!=C){return true;}}return false;
}
bool ok()
{int x=0;for(int i=n-1;i>=0;i--){A=key[s1[i]]; B=key[s2[i]]; C=key[s3[i]];if((A+B+x)%n!=C)return false;x=(A+B+x)/n;}return true;
}
void print()
{for(int i=0;i<n-1;i++){printf("%d ",key[i+'A']);}printf("%d",key[n-1+'A']);exit(0);
}
void dfs(int x)
{if(wrong()) return;if(x==n){if(ok())print();return;}for(int i=n-1;i>=0;i--){if(used[i]==0){used[i]=1;key[order[x]]=i;dfs(x+1);used[i]=0;key[order[x]]=-1;}}
}int main()
{memset(s1,0,sizeof(s1));memset(s2,0,sizeof(s2));memset(s3,0,sizeof(s3));scanf("%d%s%s%s",&n,s1,s2,s3);memset(used,0,sizeof(used));for(int i=n-1;i>=0;i--){GetOrder(s1[i]);GetOrder(s2[i]);GetOrder(s3[i]);}for(int i='A';i<='Z';i++){key[i]=-1;}memset(used,0,sizeof(used));dfs(0);return 0;
}
key數(shù)組保存的是譯出的對(duì)照表,s1,s2,s3保存的是題目給定的算式
重點(diǎn)是order數(shù)組和剪枝條件wrong()
先看剪枝條件吧:
1.如果最高位加起來(lái)大于n顯然需要剪枝
2.如果某一豎列已經(jīng)確定,且加(A+B)%n!=C && (A+B+1)%n!=C需要剪枝,因?yàn)檫@是加法運(yùn)算,所以進(jìn)位只能為1
但是在確定搜索順序的時(shí)候我們發(fā)現(xiàn)如果從A=0 B=1這樣沒(méi)有規(guī)律的暴力搜索的話第二個(gè)剪枝條件只有到最后才能發(fā)揮作用,因?yàn)榭赡苤挥写蟛糠值臄?shù)字被確定下來(lái)這一豎列才能確定,那這樣前面的就功虧一簣了,所以為了解決這個(gè)問(wèn)題我們加上order數(shù)組,即按照order數(shù)組的順序進(jìn)行搜索
order數(shù)組的順序就是一豎列一豎列的搜索,這樣只有前面的豎列都已經(jīng)滿足那個(gè)簡(jiǎn)單關(guān)系后才會(huì)進(jìn)行后面的搜索,所以會(huì)快很多。
因?yàn)樽罡呶恍枰瑫r(shí)滿足上面兩個(gè)剪枝條件,所以從高位向地位搜索效率更高!
雖然能理解,但是還是覺(jué)得自己做的話很難想到這么多的條件。在分析問(wèn)題的時(shí)候要按照問(wèn)題的特性去分析,不要將自己局限在某一個(gè)小小的空間內(nèi)。
總結(jié)
以上是生活随笔為你收集整理的P1092虫食算-深度优先搜索+玄学剪枝的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。