生活随笔
收集整理的這篇文章主要介紹了
【20171111】Codevs 1064 虫食算80分
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述?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 ?
轉載于:https://www.cnblogs.com/CXSheng/p/7819327.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的【20171111】Codevs 1064 虫食算80分的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。