洛谷 P1092 蟲食算

2022-04-06 05:32:05 字數 3342 閱讀 9140

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

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

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

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

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

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

輸入格式:

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

輸出格式:

包含一行。在這一行中,應當包含唯一的那組解。解是這樣表示的:輸出n個數字,分別表示a,b,c……所代表的數字,相鄰的兩個數字用乙個空格隔開,不能有多餘的空格。

輸入樣例#1:

5

abced

bdace

ebbaa

輸出樣例#1:

1 0 3 4 2
對於30%的資料,保證有n

對於50%的資料,保證有n

對於全部的資料,保證有n

noip2004提高組第4題

1 #include 2 #include 3 #include 4 #include 5

6const

int n(27);7

bool vis[2333],use[2333];8

char

a[n],b[n],c[n];

9int n,ans[2333

],len;

10 std::vectortmp;

1112

bool

check()

1323 tt+=ans[ca]+ans[cb];

24if(tt%n!=ans[cc]) return

false

;25 tt/=n;26}

27return

true;28

}29void dfs(int

x)30

37char ch=tmp[x];

38for(int i=0; ii)

3945}46

47int

presist()

4856 len=tmp.size();

57 memset(ans,-1,sizeof

(ans));

58 dfs(0

);59

return0;

60}6162

int aptal=presist();

63int main()

從0--n-1填數,tle3個,70分

1 #include 2 #include 3 #include 4 #include 5

6const

int n(27);7

bool vis[2333],use[2333];8

char

a[n],b[n],c[n];

9int n,ans[2333

],len;

10 std::vectortmp;

1112

bool

check()

1323 tt+=ans[ca]+ans[cb];

24if(tt%n!=ans[cc]) return

false

;25 tt/=n;

26 } /*

if(if_)

27for(; i--; )

28*/

33return

true;34

}35void dfs(int

x)36

43char ch=tmp[x];

44for(int i=n-1; i>=0; --i)

4551}52

53int

presist()

5462 len=tmp.size();

63 memset(ans,-1,sizeof

(ans));

64 dfs(0

);65

return0;

66}6768

int aptal=presist();

69int main()

從n-1--0填數,tle1個,90分

1 #include 2 #include 3 #include 4 #include 5

6const

int n(27);7

bool vis[2333],use[2333];8

char

a[n],b[n],c[n];

9int n,ans[2333

],len;

10 std::vectortmp;

1112

bool

check()

1323 tt+=ans[ca]+ans[cb];

24if(tt%n!=ans[cc]) return

false

;25 tt/=n;

26 } if

(if_)

27for(; i--; )

2833

return

true;34

}35void dfs(int

x)36

43char ch=tmp[x];

44for(int i=n-1; i>=0; --i)

4551}52

53int

presist()

5462 len=tmp.size();

63 memset(ans,-1,sizeof

(ans));

64 dfs(0

);65

return0;

66}6768

int aptal=presist();

69int main()

ac 增加有效剪枝,每次判斷位置進製情況,判斷dfs是否可行

洛谷P1092 蟲食算

所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是5和3,第二行的數字是5。現在,我們對問題做兩個限制 首先,我們只考慮加法的蟲食算。這裡的加法是n進製加法,算...

洛谷P1092 蟲食算

所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是5和3,第二行的數字是5。現在,我們對問題做兩個限制 首先,我們只考慮加法的蟲食算。這裡的加法是n進製加法,算...

洛谷 p1092 蟲食算

這個題折騰了我好久 這其實本質上是一道湊算式的題目 讓乙個二維陣列存算式,乙個一位陣列存字母分別代表哪個數字。需要注意的是數字還有位置的標號的問題 究竟是0 n還是1 n還是0 n 1 這是需要仔細考慮的問題。直接上 吧 includeusing namespace std char ss 4 30...