کسی می تونه به من در نوشتن برنامه هشت وزیر در C کمک کنه؟
Printable View
کسی می تونه به من در نوشتن برنامه هشت وزیر در C کمک کنه؟
الگوریتم 8 وزیر (Eight Queens):
این الگوریتم از دو تابع تشکیل شده (البته شبه کد است. آن را تبدیل کنید به C)
حل این مسئله هشت مرحله دارد:کد:Eight_Queens ( var t:array[1..8]; var i:integer )
for t[i] := 1 to 8 do
if Empty(t,i) then
if i==8 then
output solution(t)
else
Eight_Queens ( t, i+1 )
endif
endif
endfor
end
*در row1 ملکه بعدی را در چه ستونی قرار دهیم که تهدید نشود.
*در row2 ملکه بعدی را در چه ستونی قرار دهیم که تهدید نشود.
.
.
*در row8 ملکه بعدی را در چه ستونی قرار دهیم که تهدید نشود.
که در هر مرحله جواب یکی از ستون ها است.
تنها چیزی که ما لازم داریم این است که یک تابع داشته باشیم (Empty) که چک کند آیا فلان خانه توسط وزیری تهدید می شود یا نه (وزیرهای قبلی در خانه های j<i آرایه هستند). به این صورت:کد:Empty ( var t:array[1..8]; var i:integer ) : boolean
var j=1..8
j:=1
while ( (t[i] <> t[j]) AND (abs(t[i]-t[j]) <> i-j) ) do
j:=j+1
endwhile
return (i=j)
end
* دو وزیره در یک ستون اند اگر t[i]==t[j]
* دو وزیر در یک قطر (اصلی) اند اگر t[i]-t[j]==i-j
* دو وزیر در یک قطر (فرعی) اند اگر t[j]-t[i]=i-j
این مسئله درخت بزرگی درست می کند ولی با استفاده از تابع Empty که تقریباً نقش یک پیشنگر را دارد فسمت کمی از این درخت بررسی می شود.
البته در صورت اجرای این الگوریتم با n بسیار بزرگ، مدت زیادی طول می کشد که به جواب برسیم.
برای گرفتن جواب، تابع Eight_Queens را به پارامترهای زیر صدا بزنید:
کد:Eight_Queens ( t,1 )
سلام میشه یکم بیشتردر مورد این الگریتم توضیح بدین.