یک مسابقه یک جایزه

شروع موضوع توسط shr6557 ‏9 دسامبر 2005 در انجمن برنامه‌نویسی C و هم خانواده‌هایش

  1. shr6557

    shr6557 Member

    ارسال‌ها:
    92
    تشکر شده:
    2
    امتیاز دستاورد:
    6
    سلام
    من یه مسابقه که همچین سخت هست رو می گم یه جایزه هم براش گذاشتم اونم یه مجموعه سی دی king 2006 حاوی 12 سی دی (معادل 12000 تومان)
    سوال از این قرار هست یک اسب چگونه می تونه از یک خانه شطرنج حرکتش رو شروع کنه و بدون اینکه خانه تکراری ای رو بره تمام خانه ها ی شطرنج رو طی کنه یعنی با 63 حرکت 64 خانه شطرنج رو طی کنه
    اینکه از چه خانه ای شروع بشه فرقی نداره
    من این برنامه رو نوشتم با تابع بازگشتی ولی این برنامه ای که من نوشتم خیلی کنده یعنی شاید چند روز هم کار
    کنه تموم نشه شما باید برنامه این بنویسید که از الگوریتم دیگه ای استفاده کنه و بتونه تمام حالات رو حساب کنه
    لطفا درمورد این که برنامه من چطوری کار می کنه نپرسید چون توضیح توی این کادر های تایپی سخت هست
    #include<iostream.h>
    #include<math.h>
    #include<conio.h>

    int table[8*8],nm=0;
    void l2l(int number);
    int main()
    {
    for (int i = 0 ; i <= 8*8-1 ; i++) table=0;
    l2l(14);
    return 0;
    }

    void l2l(int number)
    {
    table[number]=1;
    nm++;
    if (nm>8*8) cout << "Find One" << endl;
    if(table[number + (8-2)] == 0 && (number + (8-2)) < 8*8 && (number + (8-2)) >= 0) l2l(number + (8-2));
    if(table[number + (8+2)] == 0 && (number + (8+2)) < 8*8 && (number + (8+2)) >= 0) l2l(number + (8+2));
    if(table[number + (2*8-1)] == 0 && (number + (2*8-1)) < 8*8 && (number + (2*8-1)) >= 0) l2l(number + (2*8-1));
    if(table[number + (2*8+1)] == 0 && (number + (2*8+1)) < 8*8 && (number + (2*8+1)) >= 0) l2l(number + (2*8+1));
    if(table[number - (8-2)] == 0 && (number - (8-2)) < 8*8 && (number - (8-2)) >= 0) l2l(number - (8-2));
    if(table[number - (8+2)] == 0 && (number - (8+2)) < 8*8 && (number - (8+2)) >= 0) l2l(number - (8+2));
    if(table[number - (2*8-1)] == 0 && (number - (2*8-1)) < 8*8 && (number - (2*8-1)) >= 0) l2l(number - (2*8-1));
    if(table[number - (2*8+1)] == 0 && (number - (2*8+1)) < 8*8 && (number - (2*8+1)) >= 0) l2l(number - (2*8+1));
    table[number]=0;
    nm--;
    }
     
    نوشته شده توسط shr6557 در ‏9 دسامبر 2005
  2. aira

    aira Member

    ارسال‌ها:
    219
    تشکر شده:
    71
    امتیاز دستاورد:
    16
    ديگه وقتي حرفي جايزه ميشه نميشه وقت رو تلف كرد
    آقا من رفتم حلش كنم....خدا به دادم برسه.......:shock:
     
    نوشته شده توسط aira در ‏9 دسامبر 2005
  3. saalek110

    saalek110 Active Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    36
    من قبلا يك شطرنج باز كامل نوشته بودم كه كار هم مي كرد. ولي فعلا فكر نكنم حريف رقبا بشم.
    حريف قدره!!
    .
     
    نوشته شده توسط saalek110 در ‏9 دسامبر 2005
  4. zfarhad2003

    zfarhad2003 Member

    ارسال‌ها:
    616
    تشکر شده:
    65
    امتیاز دستاورد:
    16
    واقعا این مسابقه فکر جالبیه.
    حالا جدای از جایزه اش که فکر نکنم کسی بدش بیاد مسئله ای رو هم که گفتین ارزش فکر کردن رو داره.

    در هرحال من هم سعی می کنم یه الگوریتمی براش پیدا کنم. البته با اجازه اساتید.
     
    نوشته شده توسط zfarhad2003 در ‏9 دسامبر 2005
  5. shr6557

    shr6557 Member

    ارسال‌ها:
    92
    تشکر شده:
    2
    امتیاز دستاورد:
    6
    پس چی شد!؟
     
    نوشته شده توسط shr6557 در ‏30 دسامبر 2005
  6. saalek110

    saalek110 Active Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    36
    من كه از اول به نفع بقيه خودم را كنار كشيدم.
    .
     
    نوشته شده توسط saalek110 در ‏30 دسامبر 2005
  7. aira

    aira Member

    ارسال‌ها:
    219
    تشکر شده:
    71
    امتیاز دستاورد:
    16
    من برنامشو نوشتم ولي يكي دوتا ايراد داره.رفعش كردم ميزارم
    به زودي:d
     
    نوشته شده توسط aira در ‏31 دسامبر 2005
  8. saalek110

    saalek110 Active Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    36
    ما كه رديم . ولي قوانين بازي را ميشه باز بگيد.
    ميشه مهره از يك خانه چند بار عبور كنه؟
    .
     
    نوشته شده توسط saalek110 در ‏1 ژانویه 2006
  9. shr6557

    shr6557 Member

    ارسال‌ها:
    92
    تشکر شده:
    2
    امتیاز دستاورد:
    6
    اگه بالا رو بخونی می بینی که نمی تونه یک خونه رو چند بار بره
     
    نوشته شده توسط shr6557 در ‏1 ژانویه 2006
  10. shr6557

    shr6557 Member

    ارسال‌ها:
    92
    تشکر شده:
    2
    امتیاز دستاورد:
    6
    منتظر جواب aira هستم
    اگر وقت نمی کنی ایراداش رو رفع کنی ایده کلی تو بگو
     
    آخرین ویرایش: ‏3 ژانویه 2006
    نوشته شده توسط shr6557 در ‏3 ژانویه 2006
  11. aira

    aira Member

    ارسال‌ها:
    219
    تشکر شده:
    71
    امتیاز دستاورد:
    16
    جواب

    بالاخره حلش كردم.البته ببخشيد ديرشد.آخه امتحان داشتم.البته بايد اعتراف كنم به تنهايي حل نكردم و از استادم هم كمك گرفتم.(خيلي هم زياد!!:D )
    من با تابع و كلاس حلش كردم.يعني به برنامه مختصات صفحه رو دادم و اينجوري مختصات حركت مهره رو برنامه دباگ ميكنه.
    اسب در صفحه شطرنج به صورت Lحركت مي كنه يعني در تو خانه اي كه هست براي حركت 2خانه به جلو و 2خانه در جهت عمود بر حركت قبلي ميرود.صفحه شطرنج رو با يك آرايه دو انديسي(a) مشخص مي كنيم ومقدار اوليه 0 ميديم.يك شمارنده هم از 1تا 64 انتخاب مي كنيم.تا اينجاش راحته اونجايي سخت ميشه كه ميخواي چهارگوشه صفحه رو در نظر بگيري.براي اين كار هم دسته بندي كردن صفحه شطرنج هست.فكر كنم متوجه شديد...
    جايزه فراموش نشه...
    :cool: :oops:
    کد (Text):

    #include<iostream.h>
    #include<conio.h>
    class chess
    {
        int i;
        int j;
        int k;
        int l;
        int n;
        int m;
        int a[8][8];
        public:
            void g0();
            int g1();
            int g2();
            void g3(int);
            void g4();
    }a;

    void chess::g0()
    {
        for(i=0;i<8;i++)
            for(j=0;j<8;j++)
                a[i][j]=0;
        cout<<"Enter position i:"<<"\t";
        cin>>k;
        cout<<endl<<"Enter position j:"<<"\t";
        cin>>l;
        a[k][l]=1;
        cout<<endl;
        cout<<"("<<k<<","<<l<<")"<<"   ";
    }

    int chess::g1()
    {
        int v,s[8];
        for(i=0;i<8;i++)
            s[i]=8;
        n=k+1;
        m=l-2;
        if(n<8 & m>=0)
            if(a[n][m]==0)
                   s[0]=g2();
        n=k+2;
        m=l-1;
        if(n<8 & m>=0)
            if(a[n][m]==0)
                s[1]=g2();
        n=k+2;
        m=l+1;
        if(n<8 & m<8)
            if(a[n][m]==0)
                s[2]=g2();
        n=k+1;
        m=l+2;
        if(n<8 & m<8)
            if(a[n][m]==0)
                s[3]=g2();
        n=k-1;
        m=l+2;
        if(n>=0 & m<8)
            if(a[n][m]==0)
                s[4]=g2();
        n=k-2;
        m=l+1;
        if(n>=0 & m<8)
            if(a[n][m]==0)
                s[5]=g2();
        n=k-2;
        m=l-1;
        if(n>=0 & m>=0)
            if(a[n][m]==0)
                s[6]=g2();
        n=k-1;
        m=l-2;
        if(n>=0 & m>=0)
            if(a[n][m]==0)
                s[7]=g2();
        v=8;
        for(i=0;i<8;i++)
            if(v>s[i])
            {
                v=s[i];
                j=i;
            }
        return j;
    }

    int chess::g2()
    {
        int x,y,z=0;
        x=n+1;
        y=m-2;
        if(x<8 & y>=0)
            if(a[x][y]==0)
                   z++;
        x=n+2;
        y=m-1;
        if(x<8 & y>=0)
            if(a[x][y]==0)
                z++;
        x=n+2;
        y=m+1;
        if(x<8 & y<8)
            if(a[x][y]==0)
                z++;
        x=n+1;
        y=m+2;
        if(x<8 & y<8)
            if(a[x][y]==0)
                z++;
        x=n-1;
        y=m+2;
        if(x>=0 & y<8)
            if(a[x][y]==0)
                z++;
        x=n-2;
        y=m+1;
        if(x>=0 & y<8)
            if(a[x][y]==0)
                z++;
        x=n-2;
        y=m-1;
        if(x>=0 & y>=0)
            if(a[x][y]==0)
                z++;
        x=n-1;
        y=m-2;
        if(x>=0 & y>=0)
            if(a[x][y]==0)
                z++;
        return z;
    }

    void chess::g3(int j)
    {
        if(j==0)
        {
            k+=1;
            l-=2;
        }
        else if(j==1)
        {
            k+=2;
            l-=1;
        }
        else if(j==2)
        {
            k+=2;
            l+=1;
        }
        else if(j==3)
        {
            k+=1;
            l+=2;
        }
        else if(j==4)
        {
            k-=1;
            l+=2;
        }
        else if(j==5)
        {
            k-=2;
            l+=1;
        }
        else if(j==6)
        {
            k-=2;
            l-=1;
        }
        else if(j==7)
        {
            k-=1;
            l-=2;
        }
    }

    void chess::g4()
    {
        a[k][l]=1;
        cout<<"("<<k<<","<<l<<")"<<"   ";
    }

    void main()
    {
        clrscr();
        int o=0;
        a.g0();
        while(o++!=63)
        {
            a.g3(a.g1());
            a.g4();
        }
        getch();
    }
     
    نوشته شده توسط aira در ‏5 ژانویه 2006
  12. shr6557

    shr6557 Member

    ارسال‌ها:
    92
    تشکر شده:
    2
    امتیاز دستاورد:
    6
    خسته نباشی ،
    چشم فراموش نمیشه
     
    نوشته شده توسط shr6557 در ‏5 ژانویه 2006
  13. FOAD_NIK

    FOAD_NIK New Member

    ارسال‌ها:
    3
    تشکر شده:
    0
    امتیاز دستاورد:
    1
    نوشته شده توسط FOAD_NIK در ‏11 می 2007
  14. FOAD_NIK

    FOAD_NIK New Member

    ارسال‌ها:
    3
    تشکر شده:
    0
    امتیاز دستاورد:
    1
    سورس من کاملا" متفاوت است.
    درضمن از سی پلاس پلاس استفاده کرده ام.
     
    نوشته شده توسط FOAD_NIK در ‏11 می 2007
  15. MnavidM

    MnavidM Active Member

    ارسال‌ها:
    2,962
    تشکر شده:
    503
    امتیاز دستاورد:
    36
    ورودتون رو به سایت تبریک میگم.

    اما این تاپیک مربوط به یک سال پیش می باشد. و کارش تموم شده.

    موفق باشید.
    نوید.
     
    نوشته شده توسط MnavidM در ‏11 می 2007

به اشتراک بگذارید