tyvj P1131 - 虫食算

P1131 - 虫食算

From sideman    Normal (ACM) 总时限:11s    内存限制:128MB

描述 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 +     CRDA DCCC 上面的算式是一个4进制的算式。很显然,我们只要让ABCD分别代表0123,便可以让这个式子成立了。你的任务是,对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解,

输入格式 InputFormat

    输入文件alpha.in包含4行。第一行有一个正整数N(N<=26),后面的3行每行有一个由大写字母组成的字符串,分别代表两个加数以及和。这3个字符串左右两端都没有空格,从高位到低位,并且恰好有N位。

输出格式 OutputFormat

    输出文件alpha.out包含一行。在这一行中,应当包含唯一的那组解。解是这样表示的:输出N个数字,分别表示A,B,C……所代表的数字,相邻的两个数字用一个空格隔开,不能有多余的空格。

样例输入 SampleInput [复制数据]

5
ABCED
BDACE
EBBAA

样例输出 SampleOutput [复制数据]

1 0 3 4 2
program  tyvj1131;
var f:array['A'..'Z'] of integer;
   q:array[0..26] of char;
   st:array[1..3,1..26] of char;
   show:array['A'..'Z'] of boolean;
   mark:array[0..26] of boolean;
   len,i,j,n,k:integer;stt:string;
function judge1:boolean;
var i:integer;r:boolean;
begin
for i:=n downto 1  do begin
 r:=true;
 for j:=1 to 3 do
  if f[st[j,i]]=-1 then r:=false;
 if (r) and ((f[st[1,i]]+f[st[2,i]])mod n<>f[st[3,i]])and((f[st[1,i]]+f[st[2,i]]+1)mod n<>f[st[3,i]]) then
  exit(false);
end;
exit(true);
end;
function judge2:boolean;
begin
k:=0;
for i:=n downto 2 do begin
 k:=k+f[st[1,i]]+f[st[2,i]];
 if (k mod n)<>f[st[3,i]] then exit(false);
 k:=k div n;
end;
k:=k+f[st[1,1]]+f[st[2,1]];
if k<>f[st[3,1]] then exit(false);
exit(true);
end;
procedure prinf;
var i:integer;
begin
  for i:=1 to n-1 do write(f[chr(64+i)],' ');
  writeln(f[chr(n+64)]);
end;
procedure dfs(kk:integer);
var i:integer;
begin
if not judge1 then exit;
if (kk>n) and (judge2) then begin
 prinf;halt
 end;
for i:=n-1 downto 0 do
 if (not mark[i])  then begin
  f[q[kk]]:=i;mark[i]:=true;
  dfs(kk+1);
  mark[i]:=false;f[q[kk]]:=-1;
 end;
end;
begin
readln(n);
for i:=1 to 3 do begin
 readln(stt);
 for j:=1 to  n do st[i,j]:=stt[j];
 end;
fillchar(show,sizeof(show),false);
fillchar(mark,sizeof(mark),false);
for i:=1 to n do f[chr(64+i)]:=-1;
len:=0;
for i:=n downto 1 do
 for j:=1 to 3 do
  if not show[st[j,i]]then begin
   inc(len);q[len]:=st[j,i];show[st[j,i]]:=true;
  end;
dfs(1);
end.

posted on 2012-10-17 21:20  馒头~blue  阅读(214)  评论(0)    收藏  举报

导航