然后用回溯就可以搜索出来了。
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.
虽然用搜索可以过,但时间还是费很多的。