1. 程式人生 > >【20171111】Codevs 1064 蟲食算80分

【20171111】Codevs 1064 蟲食算80分

出現 表示 output 都沒有 tput codevs xtra 容易 scan

題目描述 Description

所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看一個簡單的例子:

43#9865#045
+ 8468#6633
44445506978

其中#號代表被蟲子啃掉的數字。根據算式,我們很容易判斷:第一行的兩個數字分別是5和3,第二行的數字是5。

現在,我們對問題做兩個限制:

首先,我們只考慮加法的蟲食算。這裏的加法是N進制加法,算式中三個數都有N位,允許有前導的0。

其次,蟲子把所有的數都啃光了,我們只知道哪些數字是相同的,我們將相同的數字用相同的字母表示,不同的數字用不同的字母表示。如果這個算式是N進制的,我們就取英文字母表午的前N個大寫字母來表示這個算式中的0到N-1這N個不同的數字:但是這N個字母並不一定順序地代表0到N-1)。輸入數據保證N個字母分別至少出現一次。




BADC
+ CBDA
DCCC

上面的算式是一個4進制的算式。很顯然,我們只要讓ABCD分別代表0123,便可以讓這個式子成立了。你的任務是,對於給定的N進制加法算式,求出N個不同的字母分別代表的數字,使得該加法算式成立。輸入數據保證有且僅有一組解,

輸入描述 Input Description

輸入包含4行。第一行有一個正整數N(N<=26),後面的3行每行有一個由大寫字母組成的字符串,分別代表兩個加數以及和。這3個字符串左右兩端都沒有空格,從高位到低位,並且恰好有N位。

輸出描述 Output Description

輸出包含一行。在這一行中,應當包含唯一的那組解。解是這樣表示的:輸出N個數字,分別表示A,B,C……所代表的數字,相鄰的兩個數字用一個空格隔開,不能有多余的空格。

樣例輸入 Sample Input

5
ABCED
BDACE
EBBAA

樣例輸出 Sample Output

1 0 3 4 2

數據範圍及提示 Data Size & Hint

對於30%的數據,保證有N<=10;
對於50%的數據,保證有N<=15;
對於全部的數據,保證有N<=26。

搜索,為了盡快剪枝,我選擇了按照豎式從上至下,從右至左逐列檢查,一旦不符就剪枝,然而還有兩個點沒過~~
 1
//begin at 15:06 2 #include<stdio.h> 3 int n; 4 int equ[3][27]; 5 char ch[3][27]; 6 int dataLet[27]; 7 char dataNum[27]; 8 int search(int x,int y,int extra)//0=failure,1=success 9 { 10 if(x==3) 11 { 12 int temp,ans; 13 if(y!=0)//pre last line 14 { 15 temp=(dataLet[equ[0][y]]+dataLet[equ[1][y]]+extra)%n; 16 if(temp!=dataLet[equ[2][y]])//wrong 17 return 0; 18 else 19 { 20 extra=(dataLet[equ[0][y]]+dataLet[equ[1][y]]+extra)/n; 21 ans=search(0,y-1,extra); 22 if(ans) 23 return 1; 24 else 25 return 0; 26 } 27 } 28 else//last last line 29 { 30 temp=(dataLet[equ[0][y]]+dataLet[equ[1][y]]+extra)%n; 31 extra=(dataLet[equ[0][y]]+dataLet[equ[1][y]]+extra)/n; 32 if(temp!=dataLet[equ[2][y]]||extra)//need to extra or wrong 33 return 0; 34 else 35 return 1; 36 } 37 } 38 else 39 { 40 int i; 41 int ans; 42 if(dataLet[equ[x][y]]!=-1)//used 43 ans=search(x+1,y,extra); 44 else 45 { 46 for(i=0;i<n;i++) 47 { 48 if(dataNum[i]!=-1) 49 continue; 50 dataLet[equ[x][y]]=i; 51 dataNum[i]=equ[x][y]+A; 52 ans=search(x+1,y,extra); 53 if(ans) 54 return ans; 55 dataLet[equ[x][y]]=dataNum[i]=-1;//used 56 } 57 } 58 return ans; 59 } 60 61 } 62 void testPrint(int input) 63 { 64 printf("%d ",input); 65 } 66 void get(char *output) 67 { 68 scanf("%s",output); 69 getchar(); 70 } 71 int main() 72 { 73 scanf("%d",&n); 74 ch[0][0]=getchar(); 75 int i,j; 76 for(i=0;i<n;i++) 77 { 78 dataLet[i]=-1; 79 dataNum[i]=-1; 80 } 81 get(ch[0]); 82 get(ch[1]); 83 get(ch[2]); 84 for(i=0;i<3;i++) 85 { 86 for(j=0;j<n;j++) 87 { 88 equ[i][j]=ch[i][j]-A;//turn to int 89 } 90 } 91 search(0,n-1,0); 92 for(i=0;i<n-1;i++) 93 { 94 printf("%d ",dataLet[i]); 95 } 96 printf("%d\n",dataLet[i]); 97 return 0; 98 } 99 //end at 15:57

【20171111】Codevs 1064 蟲食算80分