Xét bài toán sau: CHESSCBG https://vn.spoj.pl/problems/CHESSCBG/ Một bàn cờ thế là một bảng gồm 4 dòng, 4 cột.. Mỗi thế cờ là một cách sắp xếp 8 quân cờ, hai quân khác nhau ở hai ô khác
Trang 1
Tôi : t
a
,
,
Trang 2I
:
[i] (1<=i<=n) |a[i]|<=10^8 (k<=n)
C (|C|<=2*(10^9))
)
)
0,1
Var :byte; C longint; A array[ 18]of longint; x bestSelection:array[ 18]of byte; Procedure try( :byte); Var j k byte; Test:longint; Begin For :=0 to do begin x i]:=j if i n then try( + ) else begin test= ; for :=1 to do inc(test, [ ]*a k]); if (( test<=C and test>bestsum)) then begin
bestsum:=test; bestselection:=x end; end; End; End; Var :byte; bestsum, :longint; bestselection:longword; A array[ 18]of longint;
Procedure duyet; Var I k byte; Test:longint; S last:longword; Begin Bestsum:=0
Bestselection:=0
last:=(1 shl )- ;
For :=1 to last do begin Test:=0 For :=0 to - do inc(Test,((s shr ) and )*a i 1]); If Test>bestsum) and Test <= C then begin bestsum:= Test; bestselection:=s End; End; End; (n*(2^n) , , , th hi c ý
Trang 3Var n:byte;
C,bestsum:longint;
A: array [1 18] of longint;
bestselection:longword;
Procedure duyettrangthaicocchan;
Var , :byte;
T : array [ 1 shl 18] of longint;
S p last:longword;
Begin
last:=( 1 shl )- ;
Bestsum:= 0 Bestselection:= 0 T 0]:=0
//Ti n hành duyệt các tr ng thái
For :=1 to last do begin
For :=0 to - do ệ
If (((s shr ) and )=1 then break;
P:= and not 1 shl ));
0)
T s]:=T p [ + ];
If T s]>bestsum) and T s]<=C then begin
bestsum:=t s];
bestselection:=s
End ; End ;
End ;
(i*(2^n)) i N 1) i ngay khi i=0
Trang 4II
Xét bài toán sau: CHESSCBG (https://vn.spoj.pl/problems/CHESSCBG/)
Một bàn cờ thế là một bảng gồm 4 dòng, 4 cột Mỗi thế cờ là một cách sắp xếp 8 quân cờ, hai quân khác nhau ở hai ô khác nhau Bài toán đặt ra là cho hai thế cờ 1 và 2, hãy tìm một số ít nhất bước di chuyển quân để chuyển từ thế 1 sang thế 2; một bước di chuyển quân là một lần chuyển quân cờ sang ô trống kề cạnh với ô quân cờ đang đứng
Dữ liệu vào
Từ file văn bản gồm 8 dòng, mỗi dòng là một xâu nhị phân độ dài 4 mà số 1/0 tương ứng với vị trí có hoặc không có quân cờ Bốn dòng đầu là thế cờ 1, bốn dòng sau là thế cờ 2
Dữ liệu ra
Gồm 1 dòng duy nhất là số bước chuyển quân ít nhất
Ví dụ
Input:
1111
0000
1110
0010
1010
0101
1010
Trang 5sau:
*n Output: Sau khi
: (n!) =20 i
/s y trong
s
:
j t j+1 T[S S S {a,b,c, d i ,b,c,d T[ {1,2,5} = 10011= 19 :
- T[ {2,5} = 10010 =18 } + a[3,1]; - T[ {1,5} = 10001 =17 } + a[3,2]; - T[ {1,2} = 00011 = 3 } + a[3,5]; 3 => T[19
t: T[s] = max (T[p] + a[k,j : s k = 1) j S [ { = (1 shl n)-1 ] 1 giây
Trang 6
cho thu trên:
const
fi = 'maxmatrix.inp' ;
fo = 'maxmatrix.out' ;
maxn = 20 ;
var n byte ; sum : int64 ; lasts : longword ;
a array[ maxn , maxn ]of longint ;
status :array[ ( 1 shl maxn )] of int64 ;
truy :array[ ( 1 shl maxn )] of byte ;
procedure doc ;
var f text ; i j byte ;
begin
assign ( , fi ); reset ( );
readln ( , );
for := 1 to do begin
for := 1 to do
read( , [ , ]);
readln ( );
end;
close ( );
end;
function bitoff ( : longword ; : byte ): longword ; begin
bitoff := s and not 1 shl ));
end;
function getbit ( : longword ; : byte ): byte ; begin
getbit :=( s shr ) and ;
end;
procedure ghi ;
var row :array[ maxn ]of byte ;
i j byte ; s longword ; f text ;
begin
assign ( , fo ); rewrite ( );
writeln ( , sum );
s := lasts ;
{row[i] mang nghĩa là ở hàng i, ta sẽ chọn cột row[i]}
for := n downto do begin
row [ ]:= truy [ ];
s := bitoff ( , truy [ ]- 1 );
procedure xuli ; var
i j k byte ; list1 :array[ maxn ]of byte ;
s p longword ; begin
status [ ]:= 0 lasts :=( 1 shl ) - 1 ; //trạng thái hoàn thành {Tính các trạng thái}
for := 1 to lasts do begin {giải mã trạng thái s: list1 sẽ lưu các vị trí bit=1,
k là số lượng bit=1, đồng thời cũng là dòng ta đang xét}
k := 0 for := 0 to - do
if getbit ( , )= 1 then begin inc ( );
list1 [ ]:= i end;
{giả sử chọn cột đầu tiên}
j := list1 [ ]+ 1
p := bitoff ( , - );
truy [ ]:= j status [ ]:= status [ ]+ a k j ];
{xét các cột còn lại}
for := 2 to do begin
j := list1 [ ]+ 1
p := bitoff ( , - );
if status [ ]< status [ ]+ a k j then begin
status [ ]:= status [ ]+ a k j ]; truy [ ]:= j
end;
end;
end;
sum := status [ lasts ];
Trang 7(n*(2^n))
IV
:
QBSELECT, QBGAME, CHESSCBG, LEM2, LEM3, MIXUP2, LASCALE, CHNREST (*), VMMTFIVE