You are on page 1of 3

Bi ton 8 Qun Hu

bi: a ra mn hnh cch sp xp 8 qun hu trn bn c 8x8, sao cho khng qun hu no n c qun hu no. u vo: Trng thi ca bn c. u ra: a ra mn hnh cc cch sp xp mt bn c y 8 qun hu tha mn iu kin u bi. I. Phn Tch Bi: Ta c mt bn c 8x8 vi 8 qun hu. Ta phi t 8 qun hu sao cho theo quy tc di chuyn ca c vua sao cho chng khng n ln nhau. Trong bi ton ny, mu ca qun hu khng c ngha. Nh vy li gii ca bi ton ny l cch xp 8 qun hu sao cho cc qun hu khng c cng hng, hoc cng ct, hoc cng ng cho. Gii Thut: Trong gii thut ny, mi li gii c k hiu bng mt mng hau[n], trong hau[i]= j l ct m qun hu hng th i ng. Theo tnh cht s hc ca cc trn bn c n x n, cc trn cc ng cho cng cha (i, j) u c tng ch s hng vi ch s ct bng i+j. Tng ny nhn cc gi tr t 2 n 2n nn ta nh s cc ng cho ny t 1 n 2n-1. Nh vy cc trn ng cho cng th nht c tng ch s dng v ct l 2, cc trn ng cho th k c tng y l k+1. Ta dng mt mng Boolean Cheo1[2n1] k hiu trng thi c qun hu no trn ng cho cng th k cha, ngha l Cheo1[k]=True nu c mt qun hu ng chim gi ng cho cng th k. Tng t, cc trn mt ng cho tr c hiu nh nhau. Hiu ny nhn gi tr t 1-n n n- 1. nh s t 1 n 2n-1 t ng cho c hiu ch s dng tr ch s ct l 1-n n ng cho c hiu y bng n-1. Khi ng cho tr th k c hiu ch s dng tr ch s ct l k-n. Ta cng dng mng Cheo2[2n-1] ch trng thi ca cc ng cho ny. II. Ci t thut ton. 1. Gii thut quy. Khai bo cc bin: int hau[n]; bool cot[n],cheo1[2*n-1],cheo2[2*n-1]; int dem; In kt qu ra mn hnh void InKq() { int i,j;

printf("Phuong an %d: ", ++dem); for (i=0; i<n; i++) printf (" %d ",hau[i]+1); printf("\n"); } t qun hu vo v tr tha mn. Ta kim tra coi v tr ca qun hu coi c an ton khng: if (cot[j] && cheo1[i+j] && cheo2[j-i+n]) nu an ton th t vo v tr v nh du cc v tr : hau[i] = j; cot[j] = false; cheo1[i+j] = false; cheo2[j-i+n] = false; kim tra coi i == n khng, nu nh bng th a kt qu ra ngoi mn hnh. Nu khng th thc hin tip vi i = i+1 if (i==n-1) InKq(); else Dat(i+1); Khi phc li bn c nh ban u th li vi nhng trng hp khc: cot[j] = true; cheo1[i+j] = true; cheo2[j-i+n] = true; Chng trnh chnh: main()// chuong trinh chinh { int i; for (i=0; i<n; i++) { cot[i] = 1; } for (i=0; i<2*n; i++) { cheo1[i] = 1; cheo2[i] = 1; } dem = 0; Dat(0); Kt qu ca bi ton vi 8 qun hu:

You might also like