PDA

View Full Version : الگوریتم چیدن 8 قلعه در صفحه شطرنج



cs_mania
پنج شنبه 15 دی 1384, 06:55 صبح
سلام
این الگوریتم انطوریه که می خواهیم 8 قلعه را در یک صفحه شطرنج طوری قرار بدهیم که همدیگر را تهدید نکنند باید این الگوریتم تمام حالات ممکن را در به وسیله ماتریس به خروجی منتقل کند:متفکر:

gm.sara
شنبه 17 دی 1384, 00:22 صبح
سلام
برای کی می خواهی من این برنامه را به زبان c دارم ولی باید خروجی اش را تغییر دهم .
بگو برای کی می خواهی ؟

mohandess_anita
یک شنبه 18 دی 1384, 15:30 عصر
لطف کنید به زبان c آن را بفرستید من هم لازم دارم با تشکر فراوان

اَرژنگ
یک شنبه 18 دی 1384, 15:34 عصر
سلام
این الگوریتم انطوریه که می خواهیم 8 قلعه را در یک صفحه شطرنج طوری قرار بدهیم که همدیگر را تهدید نکنند باید این الگوریتم تمام حالات ممکن را در به وسیله ماتریس به خروجی منتقل کند:متفکر:

تمام ۴۰۳۲۰ نوع مختلف را به خروجی منتقل کند؟

gm.sara
دوشنبه 19 دی 1384, 15:11 عصر
سلام این برنامه کلیه حالت ها را مختصاتشان را می دهد یعنی 8 مختصات در خروجی چاپ می کند که 8 قلعه می تونه قرار بگیرد .

#include<stdio.h>
#include<conio.h>
#include<math.h>
int Cross(int a,int b,int d){
if (a==b || abs(a-b)==d)
return 0;
else
return 1;
}
void main (void){
int a,b,c,d,e,f,g,h,count=0;
clrscr();
for(a=1;a<=8;a++)
for(b=1;b<=8;b++)
if(Cross(a,b,1))
for(c=1;c<=8;c++)
if(Cross(c,b,1) && Cross(c,a,2))
for(d=1;d<=8;d++)
if(Cross(d,c,1) && Cross(d,b,2) && Cross(d,a,3))
for(e=1;e<=8;e++)
if(Cross(e,d,1) && Cross(e,c,2) && Cross(e,b,3) && Cross(e,a,4))
for(f=1;f<=8;f++)
if(Cross(f,e,1) && Cross(f,d,2) && Cross(f,c,3) && Cross(f,b,4) && Cross(f,a,5))
for(g=1;g<=8;g++)
if(Cross(g,f,1) && Cross(g,e,2) && Cross(g,d,3) && Cross(g,c,4) && Cross(g,b,5) && Cross(g,a,6))
for(h=1;h<=8;h++)
if(Cross(h,g,1) && Cross(h,f,2) && Cross(h,e,3) && Cross(h,d,4) && Cross(h,c,5) && Cross(h,b,6) && Cross(h,a,7)){
count++;
printf("%d,%d\n",1,a);
printf("%d,%d\n",2,b);
printf("%d,%d\n",3,c);
printf("%d,%d\n",4,d);
printf("%d,%d\n",5,e);
printf("%d,%d\n",6,f);
printf("%d,%d\n",7,g);
printf("%d,%d\n\n",8,h);
getch();
}
printf("%d",count);
}
در این برنامه 92 حالت است که قلعه ها می تونند قرار بگیرند .

cs_mania
پنج شنبه 22 دی 1384, 18:55 عصر
ممنون از جوابتون خیلی کمکم کرد
اما یه سوال چه طوری میشه تمام حالات را بررسی کنه همین طور با recursive به صورت بازگشتی هم میشه نوشتش یا نه ؟

gm.sara
جمعه 23 دی 1384, 21:30 عصر
ممنون از جوابتون خیلی کمکم کرد
اما یه سوال چه طوری میشه تمام حالات را بررسی کنه همین طور با recursive به صورت بازگشتی هم میشه نوشتش یا نه ؟
سلام
بله این برنامه را هم می توان به صورت بازگشتی نوشت .
اما منظورت چیه که چه طوری می شه تمام حالات را بررسی کنه ؟ (یعنی توضیح برنامه ؟!)

cs_mania
شنبه 24 دی 1384, 19:47 عصر
نه یعنی تمام !8 حالات را نشان بدهد چون در این حالت 92 تا بیشتر جواب نمیده

gm.sara
شنبه 24 دی 1384, 22:35 عصر
نه یعنی تمام !8 حالات را نشان بدهد چون در این حالت 92 تا بیشتر جواب نمیده

سلام
تمام !8 را:متعجب: ؟! من اولین باری است که می شنوم . لطفا توضیح بیشتر بدهید.

اَرژنگ
یک شنبه 25 دی 1384, 03:42 صبح
سلام
تمام !8 را:متعجب: ؟! من اولین باری است که می شنوم . لطفا توضیح بیشتر بدهید.

۴۰۳۲۰=!۸
دفعه اوّل نیست که بیان شده، در پست قبلیم نوشته شده بود.
رخها را باید طوری چید که در هر ردیف افقی و عمودی فقط یک رخ قرار داشته باشه.


XOOOOOOO
OXOOOOOO
OOXOOOOO
OOOXOOOO
OOOOXOOO
OOOOOXOO
OOOOOOXO
OOOOOOOX

حالا این ۸ نوع را میشه در !۸ روش مختلف جایشان را با هم عوض کرد.

seyedof
یک شنبه 25 دی 1384, 05:55 صبح
سلام
بابا اوون 92 مال یه چیز دیگه است :) 92 حالت مال 8 وزیره . این یکی فرق فوکوله. تعداد جوابهای 8 رخ 8! یا همون 40320 حالت میشه. سورس 8 وزیر که مثل زیبیل توی این انجمن ریخته و فقط خواجه حافظ شیرازی اوون رو بلد نیست. فقط کافیه توی همون برنامه 8 وزیر قسمت چک کردن تهدید قطری رو بردارید. چیزی که بدست میاد میشه برنامه 8 رخ.
ممنون علی

اَرژنگ
یک شنبه 25 دی 1384, 14:00 عصر
منتها این سوال را خیل راحتر از ۸ وزیر میشه حل کرد، بر استفاده از recusion زیادی تاکید میشه، وقتش رسیده که یک روش تمیزتر و بهتر اراعه داده بشه،
برنامه ۸ وزیر احتیاجی به recursion نداره، ولی همه مثل گوسفند عادت دارن که فقط از یک روش استفاده کنند.
اینکه یک نفر سعی کرده به این سوال بدون استفاده از recursion جواب بده جایه تشویق داره.

gm.sara
یک شنبه 25 دی 1384, 23:39 عصر
منتها این سوال را خیل راحتر از ۸ وزیر میشه حل کرد، بر استفاده از recusion زیادی تاکید میشه، وقتش رسیده که یک روش تمیزتر و بهتر اراعه داده بشه،
برنامه ۸ وزیر احتیاجی به recursion نداره، ولی همه مثل گوسفند عادت دارن که فقط از یک روش استفاده کنند.
اینکه یک نفر سعی کرده به این سوال بدون استفاده از recursion جواب بده جایه تشویق داره.
سلام
من از شما ممنون هستم . بله من برنامه را با 8 وزیر اشتباه گرفته بودم الان متوجه اشتباهم شدم .دوست عزیزمان seyedof درست گفتند اگر قسمت چک تهدید قطری برداشته شود فکر می کنم برنامه کاملا درست می شود .
و شما دوست عزیز منظورتان از recursion چیه ؟:متفکر: ( همان recursive ؟!)
راستی البته ببخشید اگر ناراحت نمی شوید : واژه گوسفند فکر کنم زیاد مناسب نباشد به هر حال تعهد ما این است که به کسی توهین نکنیم . (با معذرت فراوان )
از راهنمایی تمام شما دوستان ممنون هستم .

اَرژنگ
دوشنبه 26 دی 1384, 02:33 صبح
سلام
من از شما ممنون هستم . بله من برنامه را با 8 وزیر اشتباه گرفته بودم الان متوجه اشتباهم شدم .دوست عزیزمان seyedof درست گفتند اگر قسمت چک تهدید قطری برداشته شود فکر می کنم برنامه کاملا درست می شود .
و شما دوست عزیز منظورتان از recursion چیه ؟:متفکر: ( همان recursive ؟!)
راستی البته ببخشید اگر ناراحت نمی شوید : واژه گوسفند فکر کنم زیاد مناسب نباشد به هر حال تعهد ما این است که به کسی توهین نکنیم . (با معذرت فراوان )
از راهنمایی تمام شما دوستان ممنون هستم .

recusrion = برگشتی،
recursiveِ = (صفت) برگشتنی.
من از گوسفند برایه توهین استفاده نکردم، بیچاره گوسفند! همیشه از بقیه پیروی میکنه و آخرش هم ....
من داشتم این بحث را تعقیب میکردم، جوابه استاندارد همانیه که مدیره بخش فمودند، و کاملاً هم درست هست، از نظره جوابی که نمره را میگره و ابداً هیچ حرفی درش نیست.
ولی از نظره ابتکاری، جوابی که شما داشتین پیش میرفتین ، جوابی که کمتر کسی بهش فکر میکنه چه اینکه حتّا بخواد الگریتمش را بیان کند.
روشهایی که از recursion استفاده میکنند ( یعنی recursiveِ هستند)، ساختمانی نیستند.
ساده ترین مثال این گونه الگریتمها، permutation (ن تا جیز را در چند روش میشه جایاشان را با هم عوض کرد، مثال (ا،ب،ث)،(ا،ث،ب)،(ب،ا،ث)،(ب،ث ا)،(ث،ا،ب)،(ث،ب،ا) )، در تمام کتابهایه الگریتمی که دیدم فقط از روش بازگشتی استفاده میشه و حتّا به اینکه میشه این سوال را به روش iterative حل کرد هیچ اشاره‌ای نیست!
یکی از برترییهایه روش iterative بر روش recursion اینه که جواب را در یک مرحله میده ولی recuriveِ باید تمام مرحله‌ها را تا مرحله اوّل پیش بره!

در ضمن اگر کسی فکر میکه گوسفند بی‌احترامیه، اون گوسفند هم خودمم ( با عرض پوزش از گوسفند).

gm.sara
دوشنبه 26 دی 1384, 17:17 عصر
recusrion
در ضمن اگر کسی فکر میکه گوسفند بی‌احترامیه، اون گوسفند هم خودمم ( با عرض پوزش از گوسفند).
سلام
من قصد بی احترامی نداشتم . اصلا حرفم را پس می گیرم شما من را متقاعد کردید . معذرت می خوام .
در مورد برنامه ام توضیحی که باید بدهم اینه که این برنامه بیشتر به الگوریتم کار کمک می کنه فکرمی کنم کسی که نداند منظور سوال چیه با خواندن این برنامه متوجه شه که اصلا چه طوری باید فکر کرد ؟ مثل راه حل می ماند . درسته که برنامه خروجی می ده اسمن برنامه است ولی بیشتر شبیه الگوریتم کار است .
ممنون از راهنمایی شما

seyedof
دوشنبه 26 دی 1384, 19:59 عصر
سلام
خیلی از برنامه های بازگشتی رو میشه به روشهای تکراری یا iterative تبدیل کرد ولیکن در اکثر موارد که جواب بازگشتی بسیار کوتاه و مختصر است روش تکراری معادل آن پیچیده و طولاتر خواهد بود. البته روشهای بازگشتی مشکل overflow stack رو هم دارند.
ممنون علی

اَرژنگ
سه شنبه 27 دی 1384, 02:19 صبح
سلام
درسته که برنامه خروجی می ده اسمن برنامه است ولی بیشتر شبیه الگوریتم کار است .

پس همونطوریی که مدیر بخش فرمودند، الگریتم ۸ وزیر را تغییر بدید جوابتان را دارید.
اینکه recursion نوشتن الگریتم را ساده‌تر میکند هم کاملاً درست هست.