Tải bản đầy đủ (.doc) (15 trang)

bài tóan tin trò chơi nim

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (90.51 KB, 15 trang )


HĂm GRUNDY
HĂm Grundy lĂ 1 Ônh xƠ tú tp ểnh X cớa 1 ỏ thệ G
vĂo tp sọ nguyận khng m
g : X > Z
+

x X > g(x);
ng vời mói ểnh x lĂ 1 sọ nguyận khng m g(x) sao
cho g(x) lĂ sọ nguyận khng m nh nht khng thuồc tp
hởp tt c cÔc sọ nguyận khng m tũổng ửng vời cÔc
ểnh y mĂ x i tời .
ệnh nghễa nhn cớa ỏ thệ :
Nẽu ỏ thệ G cĩ HĂm Grundy G(x) thề nhn S cớa ỏ thệ
lĂ tp hởp nhừng ểnh mĂ giÔ trệ hĂm Grundy tƠi ĩ bêng
0
ệnh lế :
ỏ thệ hừu hƠn khng cĩ mƠch vời ồ dĂi lầ thề cĩ
nhn
Trỉ chổi loƠi thng tin hừu hƠn , y ớ, ọi
khÔng :
LĂ trỉ chổi 2 ngũỗi thay nhau ln lũởt i vĂ tha mÊn
nhừng ièu kiẹn sau :
+ Mòi thng tin cớa 1 thẽ chổi lĂ hoĂn toĂn ũởc xÔc
ệnh y ớ ( gòi lĂ 1 trƠng thÔi chổi - hay lĂ 1 thẽ chổi )
+ Cĩ trƠng thÔi ban u vĂ trƠng thÔi kẽt thùc . TrƠng
thÔi kẽt thùc lĂ trƠng thÔi khng th biẽn õi tiẽp thĂnh trƠng
thÔi khÔc ũởc nừa .
+ XÔc ệnh ũởc phẫp biẽn õi tú thẽ chổi nĂy sang thẽ
chổi khÔc vĂ sau mồt sọ hừu hƠn phẫp biẽn õi thề dn tời
trƠng thÔi kẽt thùc


Nhừng trỉ chổi nhũ thẽ thề tỏn tƠi 1 thut toÔn
ngũỗi chổi i trũờc ( hoằc sau) giĂnh hỉa hoằc thng
Cĩ th chuyn trỉ chổi thĂnh 1 ỏ thệ G(X,F) ố y X
lĂ tp ểnh - Mói ểnh lĂ 1 thẽ chổi - cỉn F lĂ phẫp biẽn õi
cÔc thẽ chổi . Cĩ ểnh khối u lĂ trƠng thÔi chổi ban u
. Trỉ chổi ũởc bt u bêng rùt thâm sau ĩ tiẽn hĂnh
theo phẫp biẽn õi F thề cĩ nhièu kh nâng thng . TrƠng
thÔi chổi kẽt thùc ửng vời ểnh kẽt thùc ,lĂ ểnh khng th
thức hiẹn F i tời ểnh khÔc ũởc nừa . u thớ nĂo
giĂnh ũởc ểnh kẽt thùc thề thng cuồc .
Chù ỹ : GiÔ trệ HĂm Grundy tƠi ểnh kẽt thùc thề bêng
0 . Nhn cớa ỏ thệ lun chửa ểnh kẽt thùc .
Mồt sọ bĂi tp
1 / Trỉ chổi Nim vời 3 ọng si : Cho 3 ọng si
N1,N2,N3 . Hai ngũỗi ln lũởt i , mói ln i ũởc bọc ố 1
ọng bt kề trong 3 ọng vời sọ si tỡy ỹ k tú 1 viận tời
hẽt ọng .
Lp trềnh trỉ chổi sao cho kh nâng thng cớa mÔy
lĂ nhièu nht
2 / Cho 1 miẽng So-co-la ũởc chia thĂnh MxN vung
bêng N-1 ũỗng ngang vĂ M-1 ũỗng dòc song song vời cÔc
cƠnh . Trận mồt vung cớa miẽng so-co-la cĩ Ônh du
hềnh con mÊ . Hai ngũỗi chổi 1 trỉ chổi nhũ sau : Ln
lũởt bầ miẽng so-co-la theo 1 rÊnh ngang hoằc dòc vĂ ũa
phn cĩ Ônh du cho ngũỗi kia . Ai khng cĩ kh nâng
bầ ũởc nừa thề thua .
Lp trềnh trỉ chổi sao cho kh nâng thng cớa mÔy
lĂ nhièu nht
Vế dủ : N=9;M=7, vệ trế Ônh du con mÊ lĂ (7,2)


3 / Cho 2 ọng si vời sọ si ố mói ọng lĂ N1,N2 viận.
Hai ngũỗi ln lũởt cĩ th bọc si theo qui lut : Bọc ố 1
ọng si sọ si tỡy ỹ tú 1 vận cho ẽn hẽt ọng ; hoằc bọc ố
c 2 ọng vời sọ si bêng nhau . Ai bọc ũởc viận cuọi cỡng
lĂ thng cuồc
Lp trềnh trỉ chổi sao cho kh nâng thng cớa mÔy
lĂ nhièu nht
4/ è thi Quọc gia 1993-1994
Cho 1 bÂng gỏm N , Ônh sọ tú 1 ẽn N theo chièu tú
trÔi qua phÂi . Hai u thớ lun phiận , ẽn lũởt mềnh cĩ th
chòn 1 hoƠc 2 lièn nhau chũa Ônh du vĂ sau ĩ Ônh
du cÔc Ê chòn . Ngũỗi nĂo ẽn lũởt mềnh mĂ khng
chòn ũởc cÔc chũa Ônh du thề coi nhũ thua cuồc .
TrƠng thÔi ban u lĂ cÔc èu chũa Ônh du .
Yậu cu :
HÊy m phng trỉ chổi : ngũỗi chổi vời mÔy sao cho
kh nâng thng cớa mÔy lĂ nhièu nht . CÔch tõ chửc mĂn
hềnh cn cho phẫp :
a ) Nhp N tú bĂn phếm
b ) Hi ngũỗi chổi chòn i trũờc hay i sau
c ) Lp lƠi cÔc thao tÔc sau y cho ẽn khi kẽt thùc :
+ Nẽu ẽn lũởt mÔy i thề thng bÔo mÔy chòn cÔc
nĂo , sau ĩ hin thệ trƠng thÔi mời cớa bâng
+ Nẽu ẽn lũởt ngũỗi i thề cho phẫp ngũỗi chổi
chòn cÔc mềnh thếch , sau ĩ hin thệ trƠng thÔi mời
cớa bâng
Khi trỉ chổi kẽt thùc cn thng bÔo ngũỗi chổi thua hay
thng .
Gởi ỹ
BĂi 1 : Mói trƠng thÔi chổi ằ trũng bối G(x)= N1 xor N2

xor N3
Nẽu ẽn lũởt mềnh i mĂ G(x) <> 0 thề bọc ố
ọng N
i
sọ si sao cho ọng nĂy cỉn lƠi sọ si lĂ N
k
xor N
h
( k,h <> i ) khi ĩ sau khi bọc thề trƠng thÔi chổi sẩ
lĂ G(x
*
) = 0 ( Tứ suy ) . Trong trũỗng hởp ẽn lũởt mềnh i
mĂ G(x) = 0 thề Ănh bọc vu vổ 1 viận kẫo dĂi tềnh
trƠng chỗ dệp may u thớ i hổi kẫm ci dn ẽn cho
mềnh trƠng thÔi G(x) <> 0
Nẽu trƠng thÔi ban u lĂ G(x) <> 0 thề ngũỗi i trũờc
lun thng !
BĂi 2 : Tũổng tứ bĂi 1 , nhũng vời 4 ọng si .
BĂi 3 : Cĩ th xy dứng hĂm Grundy bêng phũổng phÔp
Lỡa bỉ vè chuỏng tềm sọ nguyận khng m nh nht
khng thuồc tp hởp sọ nguyận khng m cho trũờc .
Program GRUNDY;
Uses crt;
Const max = 100;
Type Ta = Array[0 max,0 max] of
Byte;
Tb = Array[0 max*max] of Boolean;
Var a : Ta;
n,m : Integer;
Procedure Nhap;

Begin
Repeat
Clrscr; Write(Cho biet gia tri 2 dong soi
1 , 2 =);
{$i-} Readln(n,m); {$i+}
Until (Ioresult=0) and (N>0) and (m>0) and
(n<=max) and (m<=max);
End;
Procedure TAOHAMGRUNDY(n:Integer);
Var i,j : Integer;
Function Gan(i,j:Integer):Integer;
Var b : Tb;
k,min : Integer;
Begin
For k:=0 to i+j+min+1 do b[k]:=True;
For k:=0 to i-1 do b[a[k,j]]:=False;
For k:=j-1 downto 0 do b[a[i,k]]:=False;
For k:=1 to min do b[a[i-k,j-k]]:=False;
For k:=0 to i+j+min+1 do
If b[k] then
Begin
gan:=k;
Exit;
End;
End;
Begin
For i:=0 to n do
For j:=i to n do
Begin
a[i,j]:=gan(i,j);

a[j,i]:=a[i,j];
End;
End;
BEGIN
Nhap;
If m>n then Taohamgrundy(m)
Else Taohamgrundy(n);
END.
V¡i chòæng trÒnh mÂu :
Chòæng trÒnh 1 ( D¥ng tâng qu¤t cía b¡i to¤n N Åäng
sÚi )
Uses Crt;
Const Max = 20;
Type Ta = Array[1 max] of Byte;
Var n,j,i : Integer;
a : Ta;
x : Byte;
Ch : Char;
Ok : Boolean;
Procedure Truocsau;
Begin
Gotoxy(20,20);
Write(‘Ban boc truoc [T] hay sau [S] ? ‘);
Repeat
Ch:=Upcase(Readkey);
Until (ch in [’T’,’S’]);
End;
Procedure Nhap;
Begin
Repeat

Clrscr; Write(‘Cho biet n:=’);
{$i-} Readln(n); {$i+}
Until (ioresult=0) and (n>=3) and (n<=max);
For i:=1 to n do
Repeat
Gotoxy(1,i+1);
Write(‘A[’,i:4,’]=’);
{$i-} Readln(a[i]); {$i+}
Until (ioresult=0) and (a[i]>0);
Truocsau;
Clrscr;
Gotoxy(1,2);Write(‘Q=’);
Gotoxy(1,3);Write(‘VT’);
For i:=1 to n do
Begin
Gotoxy(i*4-3,2);
Write(a[i]:4);
Gotoxy(i*4-3,2);
Write(i:4);
End;
End;
Function TIMGRUNDY:Byte;
Var x : Byte;
Begin
x:=a[1];
For i:=2 to n do
x:=x xor a[i];
Timx:=x;
End;
Procedure Hien(soquan,Vitri:Byte);

Var i:Byte;
Begin
Gotoxy(vitri*4-3,2); Textcolor(12+16);
Write(a[vitri]:4);
Sound(200);
Delay(300);
Nosound;
Dec(a[vitri],soquan);
Gotoxy(vitri*4-3,2); Textcolor(7);
Write(a[vitri]:4);
End;
Procedure Lay1(Var soquan,vitri:Byte);
Begin
For i:=1 to n do
If (a[i]>0) then
Begin
soquan:=1;
vitri:=i;
Exit;
End;
End;
Procedure Lay2(Var soquan,vitri:Byte);
Begin
For i:=1 to n do
If ((x XOR a[i]) < a[i]) then
Begin
vitri := i;
soquan := a[i]-(x xor a[i]);
Exit;
End;

End;
Procedure Maydi;
Var soquan,vitri:Byte;
Begin
x:=timGRUNDY;
If x=0 then lay1(soquan,vitri)
Else Lay2(soquan,vitri);
Textcolor(12+16);
Gotoxy(30,14); Write(‘ MAY BOC ‘);
Textcolor(7);
Gotoxy(20,15); Write(‘May boc dong so ?
:=’,vitri);
Gotoxy(20,16); Write(‘va so quan boc ?
:=’,soquan);
Hien(soquan,vitri);
Delay(1000);
Gotoxy(30,14); Write(‘ MAY BOC ‘);
End;
Procedure Bandi;
Var soquan,vitri:Byte;
Begin
Textcolor(12+16);
Gotoxy(30,21); Write(‘ MOI BAN BOC ‘);
Textcolor(7);
Repeat
Gotoxy(20,22); Write(‘Ban boc dong so ?
:=’);
{$i-} Readln(vitri); {$i+}
Until (Ioresult=0) and (vitri>0) and (vitri<=n)
and (a[vitri]>0);

Repeat
Gotoxy(20,23); Write(‘va so quan
boc ? :=’);
{$i-} Readln(soquan); {$i+}
Until (Ioresult=0) and (soquan>0) and
(soquan<=a[vitri]);
Hien(soquan,vitri);
Gotoxy(30,21); Write(‘ MOI BAN BOC ‘);
End;
Function Kiemtraketthuc:Boolean;
Var i:Byte;
Begin
Kiemtraketthuc:=False;
For i:=1 to n do
If a[i]<>0 then Exit;
Kiemtraketthuc:=True;
End;
Procedure Play;
Begin
If ch=’T’ then Bandi;
Ok:=True;
While not kiemtraketthuc do
Begin
Ok:=True;
Maydi;
If kiemtraketthuc then Exit;
Ok:=False;
Bandi;
End;
End;

BEGIN
Repeat
Nhap;
Play;
Gotoxy(20,10);
If ok Then Write(‘Ban da that bai’)
Else Write(‘Ban rat thong minh va ban da chien
thang’);
Gotoxy(20,25);
Write(‘Esc de thoat ‘);
Until (readkey=#27);
END.
Chòæng trÒnh mÂu 2 :
Uses crt;
Const max = 40;
Type Ta = Array[0 max+1] of integer;
Var b : ta;
a : Array[0 max] of Record
dodai,vt: integer;
End;
n,m : Integer;
Pa : Ta;
ok : Boolean;
ch : Char;
Procedure Nhap;
Begin
Repeat
Clrscr; Write('Cho biet do dai N:=');
{$i-} Readln(n); {$i+}
Until (ioresult=0) and (N>0) and (N<=max);

Gotoxy(1,2); Write('Ban boc truoc [T] hay sau [S]
');
Textcolor(15+16); Write('? ');
Textcolor(15);
Repeat
Ch:=Upcase(readkey);
Until (ch in ['T','S']);
End;
Procedure Khoitaobandau;
Var i:integer;
Begin
m:=1;
a[m].dodai:=n;
Gotoxy(1,5);
For i:=1 to n do
Begin
B[i]:=0;
Write(' Û');
End;
b[0]:=1;
b[n+1]:=1;
End;
Procedure Hien1(ch:char; i:integer;Mau:Byte);
Begin
Textcolor(Mau);
Gotoxy(i*2-1,5); Write(' Û');
Case ch of
'2' : Begin
Gotoxy((i+1)*2-1,5); Write(' Û');
End;

'0' : Begin
Gotoxy((i-1)*2-1,5); Write(' Û');
End;
End;
End;
Procedure Hien(ch:char; i:Byte);
Begin
Hien1(ch,i,12+16);
Delay(1000);
Hien1(ch,i,12);
End;
Function Di(var ch:Char):integer;
Var i:integer;
Procedure Hien;
Begin
If b[i]=0 then Textcolor(15)
Else Textcolor(7);
Gotoxy(1,18); Write(' Chi danh o hien tai
1 ');
If (b[i+1]=0) and (b[i]=0) then Textcolor(15)
Else Textcolor(7);
Gotoxy(1,19); Write(' Danh dau o hien tai va o
ben phai 2 ');
If (b[i-1]=0) and (b[i]=0) then Textcolor(15)
Else Textcolor(7);
Gotoxy(1,20); Write(' Danh dau o hien tai va o
ben trai 0 ');
Gotoxy(10,17);
If b[i]=0 then Textcolor(15)
Else Textcolor(7);

Write('Vi tri hien tai ',i:4);
End;
Function Kiemtra(ch:Char):Boolean;
Begin
Kiemtra:=False;
Case ch of
'0' : If b[i-1]<>0 then Exit;
'2' : if b[i+1]<>0 then Exit;
End;
Kiemtra:=True;
End;
Begin
i:=1;
Repeat
Hien;
Textcolor(14);
Gotoxy(i*2-1,5);Write(' Û');
Gotoxy(80,24);
Ch:=Readkey;
If b[i]=0 then Textcolor(15)
Else Textcolor(12);
Gotoxy(i*2-1,5);Write(' Û');
Gotoxy(80,24);
Case ch of
'K': If i>1 then Dec(i)
Else i:=n;
'M' :If i<n then Inc(i)
Else i:=1;
End;
Until (ch in ['0','1','2']) and (b[i]=0) and

kiemtra(ch) ;
di:=i;
End;
Procedure Taoa;
Var i:integer;
Function Doc(Var i:integer):integer;
Var phu:integer;
Begin
phu:=0;
While (b[i]=0) do
Begin
Inc(phu);
Inc(i);
End;
doc:=Phu;
End;
Procedure Gattrong(Var i:integer);
Begin
While (b[i]<>0) and (i<=n) do Inc(i);
End;
Begin
i:=1;
m:=0;
While (i<=n) do
Begin
Gattrong(i);
Inc(m);
a[m].vt:=i;
a[m].dodai:=doc(i);
End;

End;
Procedure Danhdau(ch:Char;i:integer);
Begin
b[i]:=1;
Case ch of
'2' : b[i+1]:=1;
'0' : b[i-1]:=1;
End;
Taoa;
Hien(ch,i);
End;
Procedure Bandi;
Var i:integer;
ch:Char;
Begin
i:=di(ch);
danhdau(ch,i);
End;
Procedure Taophuongan;
Var i:integer;
Function Tao(I:integer):integer;
Var j : integer;
Kiemtra: Ta;
Begin
For j:=0 to i+1 do kiemtra[j]:=0;
For j:=0 to i-2 do
Begin
kiemtra[pa[j] xor pa[i-j-1]]:=1;
kiemtra[pa[j] xor pa[i-j-2]]:=1;
End;

For j:=1 to i+1 do
If (kiemtra[j]=0) then
Begin
Tao:=j;
Exit;
End;
End;
Begin
pa[0]:=0;
pa[1]:=1;
For i:=2 to n do
pa[i]:=Tao(i);
End;
Function Timx:integer;
var j,x:integer;
Begin
x:=pa[a[1].dodai];
For j:=2 to m do
x:=x xor pa[a[j].dodai];
Timx:=x;
End;
Procedure Maydi;
Var x ,vitri ,i: Integer;
ch : char;
Procedure Bangqua;
Var j:integer;
Begin
ch:='1';
For j:=1 to n do
If b[j]=0 then

Begin
vitri:=j;
If random(3)=1 then Exit;
End;
End;
Function Lam(i:Integer):Boolean;
Var j,t : Integer;
Begin
Gotoxy(50,18); Clreol;
Textcolor(15);
Lam:=True;
t:=a[i].dodai;
For j:=0 to t-1 do
Begin
If (pa[j] xor pa[t-j-1]) xor (x xor pa[t]) = 0 then
Begin
vitri:=a[i].vt+j;
ch:='1';
Gotoxy(50,18); Write('May danh dau o
',vitri:3);
Exit;
End;
If (t-j-2>=0) then
If (pa[j] xor pa[t-j-2]) xor (x xor pa[t]) = 0 then
Begin
vitri:=a[i].vt+j;
ch:='2';
Gotoxy(50,18);
Write('May danh dau 2 o ',vitri:3,vitri+1:3);
Exit;

End;
End;
Lam:=False;
End;
Begin
taoa;
x:=timx;
If (x<>0) then
Begin
For i:=1 to m do
If lam(i) then
Begin
danhdau(ch,vitri);
Exit;
End;
End;
Bangqua;
danhdau(ch,vitri);
Gotoxy(50,18); Write('May danh dau o ',vitri:3);
End;
Function ketthuc:Boolean;
Var i:Byte;
Begin
Ketthuc:=False;
For i:=1 to n do
If b[i]=0 then Exit;
Ketthuc:=true;
End;
Procedure Thongbao;
Begin

Textcolor(15); gotoxy(20,10);
If ok then Write('Ban da that bai')
Else Write('Ban da thang loi');
End;
Procedure Choi;
Begin
If ch='T' then bandi;
Ok:=False;
While not ketthuc do
Begin
maydi;
Ok:=not ok;
If ketthuc then Exit;
bandi;
Ok:=not ok;
End;
End;
BEGIN
Textbackground(1);
Randomize;
Repeat
Textcolor(15);
Nhap;
Khoitaobandau;
Taoa;
Taophuongan;
choi;
Thongbao;
Gotoxy(20,25);
Write('ESC to quit or press any key to continue . .

.');
Until Readkey=#27;
END.

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×