讨论 / 《彩旗飘飘》用回溯AC了。。。
sbxiaobai7 2013-11-29 23:03:26
点我顶贴 收藏 删除
我是把红标记为‘1’,吧黄标记为‘2’。

然后用回溯就可以搜索出来了。

Pascal代码如下:

const kind:array[1..4] of string=('11','12','21','22');{这是四种基本的组合}

rasA:array[1..4] of integer=(2,1,1,0);{表示用kind[i]时,红旗增加的数目}

rasB:array[1..4] of integer=(0,1,1,2);{表示用kind[i]时,黄旗增加的数目}

var n,m:integer;

num:longint;{表示最后有多少种类}

s1:string;

procedure search(s2:string;A,B:integer);{回溯搜索,参数中A表示红旗的数目}

var i,dif,re,ye:integer;s:string;

begin

dif:=0;s:=s2;re:=A;ye:=B;

if (A>n)or(B>n) then exit;{数目超过限制,退出}

if (A=n)and(B=n) then{如果数目符合了}

begin

for i:=2 to 2*n do

if s[i]<>s[i-1] then inc(dif);{找不同的地方}

if dif=m then begin inc(num);exit; end{若符合则num++}

else exit;

end;

for i:=1 to 4 do{搜索四种基本类型}

begin

s:=s+kind[i];

re:=re+rasA[i];

ye:=ye+rasB[i];

search(s,re,ye);{以下就是回溯了}

re:=re-rasA[i];

ye:=ye-rasB[i];

s:=s2;

end;

end;

Begin

readln(n,m);

s1:='';

search(s1,0,0);

write(num);

End.

虽然用搜索可以过,但时间还是费很多的。

查看更多回复
提交回复