題目大意:給你一些操作(操作和串的長度一樣,操作的每一位對應串的每一位),一些串和它的目標串,求出把它變換成目標串的最小操作次數。
串的長度len<=20,操作方式m<=50,n<=4
考慮到直接列舉所有操作並且每次對每一位進行操作會很慢,又都是01串,很容易想到位運算。
把每乙個串都看成乙個二進位制數,修改為1等價於or 1,修改為0為and 0,取反為xor 1。
所以建立三個陣列,c0,c1,cqf表示三種運算,乙個操作則對應三個二進位制數。
這樣狀態就可以o(1)的轉移。
programneayo;
const
inf='
quantum.in';
ouf='
quantum.out';
vari,j,k,len,now,target,min,m,n:longint;
a:array[0..4]of
longint;
c0,c1,cqf:
array[0..51]of
longint;
h:array[0..2097152] of
boolean;
q,qt:
array[0..1000000]of
longint;
procedure
bfs;
vari,tmp,time,top,closed:longint;
begin
time:=0; top:=0;closed:=1;q[1]:=now;qt[1]:=0
;
repeat
inc(top);
if top>1000000
then top:=1
; now:=q[top];
for i:=1
to m do
begin
tmp:=now and
c0[i];
tmp:=tmp or
c1[i];
tmp:=tmp xor cqf[i];
inc(time);
ifnot h[tmp] then
begin
h[tmp]:=true;
inc(closed);
if closed>1000000
then closed:=1
; q[closed]:=tmp;
qt[closed]:=qt[top]+1
;
if qt[closed]=6
then
closed:=closed;
if tmp=target then
begin
writeln(qt[closed]);
exit;
end;
end;
end;
until(h[target] or (time>100000000000)or (top>=closed));
writeln('np
');end;
procedure
init;
vars:string;
begin
assign(input,inf);assign(output,ouf);
reset(input);rewrite(output);
readln(len,m,n);
for i:=1
to m do
begin
readln(s);
for j:=1
to len do
begin
if s[j]<>'c'
then c0[i]:=c0[i]+(1 shl (len-j));
if s[j]='s'
then c1[i]:=c1[i]+(1 shl (len-j));
if s[j]='f'
then cqf[i]:=cqf[i]+(1 shl (len-j));
end;
end;
for i:=1
to n do
begin
fillchar(h,sizeof(h),false);
readln(s);
now:=0;target:=0
;
for j:=1
to len do
if s[j]='1'
then now:=now+(1 shl (len-j));
delete(s,
1,len+1
);
for j:=1
to len do
if s[j]='1'
then target:=target+(1 shl (len-j));
if now=target then
begin
writeln(0);
continue;
end;
h[now]:=true;
bfs;
end;
close(input);
end;
begin
init;
close(output);
end.
CF591CF01串的變換,找規律
這題知道應該是乙個規律題,然而並沒有什麼卵用,規律找不到,ac不了,前面倆題手速不夠快,只能掉rating。說一下這題的規律 首先只有101和010會變化,很明顯可以知道,然後開個陣列,記錄需要變化的位置,然後每一段需要變化的01串需要交換的次數為 len 1 2 然後變化的規律 具體細節看 另外貼...
01串的排序問題 演算法
01 串的排序問題 code 首先按長度排序,長度一樣,按 1 的個數排序,1 的個數一樣時,就按ascii排序 include include include include include if there is not included fstream libary we will get t...
整數變換問題
problem description 整數變換問題。關於整數i的變換f和g定義如下 f i 3i 試設計乙個演算法,對於給定的2 個整數n和m,用最少的f和g變換次數將n變換為m。例如,可以將整數15用4 次變換將它變換為整數4 4 gfgg 15 當整數n不可能變換為整數m時,演算法應如何處理?...