[luogu 1092] 蟲食算 (暴力搜尋剪枝)

來源:互聯網
上載者:User

標籤:get   desc   line   des   img   表示   abc   -o   space   

傳送門

Description

Input

包含四行。
第一行有一個正整數 (N≤26)。

後面的三行,每行有一個由大寫字母組成的字串,分別代表兩個加數以及和。這3個字串左右兩端都沒有空格,從高位到低位,並且恰好有N位。

Output

一行,即唯一的那組解。

解是這樣表示的:輸出NN個數字,分別表示A,B,C,…所代表的數字,相鄰的兩個數字用一個空格隔開,不能有多餘的空格。

Sample Input

5
ABCED
BDACE
EBBAA

Sample Output

1 0 3 4 2

INIT

對於30%的資料,保證有N≤10;

對於50%的資料,保證有N≤15;

對於全部的資料,保證有N≤26。

noip2004提高組第4題

Solution

暴力搜尋剪枝沒啥好說的。。。
寫完才明白按照一列搜尋比按字母搜尋要快好多,也好剪枝
於是我寫了一大堆特判才卡過

Code

醜陋的代碼

#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define F(i,a,b) for(register int i=(a);i<=(b);i++)#define R(i,a,b) for(register int i=(b);i>=(a);i--)using namespace std;inline int read() {    int x=0,f=1;char c=getchar();    while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}    while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();    return x*f;}const int N=30;bool flag;int n,tot,cnt;bool vis[N];int A[N],B[N],C[N],mp[N],sta[N],deg[N],id[N];char ch[N];bool ck() {    int A1=mp[A[1]],B1=mp[B[1]],C1=mp[C[1]];    if(~A1&&~C1&&A1>C1) return 0;    if(~B1&&~C1&&B1>C1) return 0;    if(~A1&&~B1) {        if(A1+B1>tot-1) return 0;        if(~C1&&A1+B1!=C1&&A1+B1+1!=C1) return 0;    }    int las=0;    R(i,1,n) {        int CA=A[i],CB=B[i],CC=C[i];        int &DA=mp[A[i]],&DB=mp[B[i]],&DC=mp[C[i]];        if(~DA&&~DB&&~DC) {            if(las==-1&&(DA+DB+1)%tot!=DC&&(DA+DB)%tot!=DC) return 0;            if(~las&&(DA+DB+las)%tot!=DC) return 0;            if(~las) las=(DA+DB+las)/n;            if(las==-1&&DA+DB>=n) las=1;        }        else if(~DA&&~DB) {            if(~las&&vis[(DA+DB+las)%tot]) return 0;            if(las==-1&&vis[(DA+DB)%tot]&&vis[(DA+DB+1)%tot]) return 0;            if(~las&&DC==-1) DC=(DA+DB+las)%tot,vis[DC]=1,sta[++cnt]=CC;        }        else if(~DA&&~DC) {            int dc=DC; if(dc<=DA) dc+=tot;            if(~las&&vis[dc-DA-las]) return 0;            if(las==-1&&vis[dc-DA]&&vis[dc-DA-1]) return 0;            if(~las&&DB==-1) DB=dc-DA-las,vis[DB]=1,sta[++cnt]=CB;        }        else if(~DB&&~DC) {            int dc=DC; if(dc<=DB) dc+=tot;            if(~las&&vis[dc-DB-las]) return 0;            if(las==-1&&vis[dc-DB]&&vis[dc-DB-1]) return 0;            if(~las&&DA==-1) DA=dc-DB-las,vis[DA]=1,sta[++cnt]=CA;        }        if(~DA&&~DB&&~las) las=(DA+DB+las)/n;        if(las==-1&&~DA&&~DB&&DA+DB>=n) las=1;        if(DA==-1||DB==-1||DC==-1) las=-1;    }    return 1;}void dfs(int pos) {    if(flag) return ;    if(~mp[id[pos]]) {dfs(pos+1);return ;}    if(pos==tot+1) {        F(i,1,tot) printf("%d ",mp[i]);        flag=1; return ;    }    F(i,0,tot-1) if(!vis[i]) {        mp[id[pos]]=i; vis[i]=1; int ls=cnt;        if(ck()) dfs(pos+1);        mp[id[pos]]=-1; vis[i]=0;         while(cnt>ls) vis[mp[sta[cnt]]]=0,mp[sta[cnt]]=-1,cnt--;        if(flag) return ;    }}bool cmp(int x,int y) {return deg[x]>deg[y];}int main() {    n=read();    scanf("%s",ch+1);F(i,1,n) {A[i]=ch[i]-'A'+1;if(!vis[A[i]]) tot++,vis[A[i]]=1;deg[A[i]]++;}    scanf("%s",ch+1);F(i,1,n) {B[i]=ch[i]-'A'+1;if(!vis[B[i]]) tot++,vis[B[i]]=1;deg[A[i]]++;}    scanf("%s",ch+1);F(i,1,n) {C[i]=ch[i]-'A'+1;if(!vis[C[i]]) tot++,vis[C[i]]=1;deg[A[i]]++;}    memset(mp,-1,sizeof(mp)); memset(vis,0,sizeof(vis));    F(i,1,n) id[i]=i;    sort(id+1,id+1+n,cmp);    F(i,1,n) if(A[i]==B[i]&&B[i]==C[i]) {mp[A[i]]=0;vis[0]=1;dfs(1);return 0;}    F(i,1,n) if((A[i]==C[i])&&A[i]!=B[i]) {        mp[B[i]]=0;vis[0]=1;dfs(1);mp[B[i]]=-1;vis[0]=0;        if(!flag) {mp[A[i]]=0;vis[0]=1;mp[B[i]]=tot-1;vis[tot-1]=1;dfs(1);}        return 0;    }    F(i,1,n) if((B[i]==C[i])&&A[i]!=B[i]) {        mp[A[i]]=0;vis[0]=1;dfs(1);mp[A[i]]=-1;vis[0]=0;        if(!flag) {mp[B[i]]=0;vis[0]=1;mp[A[i]]=tot-1;vis[tot-1]=1;dfs(1);}        return 0;    }    dfs(1);    return 0;}

[luogu 1092] 蟲食算 (暴力搜尋剪枝)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.