نمایش نتایج 1 تا 3 از 3

نام تاپیک: سودکو

  1. #1

    سودکو

    سلام من يک برنامه حل کننده سود کو نوشتم فقط نمی دونم اعداديی که بايد ثابت باشند چيکا ر کنم ثابت بمونن چون وقتی حل می کنه عدد ثابت هم جاشون عوض ميشه این برنامه به زبان C.

    {برنامه به این صورت ميباشد که ابتدا يک آريه دو بعدي 9*9 تعريف ميکنه (که عناصر آريه همان خانه های جدول ميباشد)
    بعد همه خانه ها را با صفر پر ميکنه سپس يک سری اعداد در خانه های جدول قرر ميده که بايد ثابت بمونند
    سپس تابعslove(0,0) صدا ميزنه منظور از دو عدد صفر ان است که از سطر صفر و ستون صفر شروع به حل جدول کن يعنی خانه اول جدول}(خط 1 تا 22 برنامه).سطر= sa----ستون=so.

    در خط اول اگر به خانه ای برسد که عدد داخلش صفر نباشد يعنی همان اعدد ثابت که از قبل نوشته ایم باشد دستورات بعد از ان اجرا ميشود
    به این صورت کا اگر در خانه اخر باشد يعنی سطر 8م و ستون 8 اريه؛ برنامه به پايان ميرسد و اعدد را چاپ ميکند
    در غير این صورت دستورif(++sa>8) اجرا ميشود يعنی اگر ستون آريه به انتها برسد به سطر بعدی ميررود (خط اول تا 14 تابع slove)


    در غير ابن صورت اگر خانه خالی باشد يعنی برابر صفر باشد دستور for int in=1;in<=9;in++)) اجرا ميشود و شروع به عدد گذاری در خانه های جدول و سرچ کردن در تابع checknum(sa,so,i)برای مساوی نبودن در ستون و سطر و خانه های 9تایي 3*3 .آگر مساوی نبود اعداد را در همان خانه قرار مي دهد و اگر عدّدی را از 1 تا 9 نتوانست قرار دهد تابع ( error(sa,so صدا ميزند (خط 16 تا 30 تابع slove).

    در تابع error ابتدا يک خانه به عقب مياد و مانند تابع sloveميباشد با این تفاوت که در تابع error برای سرچ عدد از 1 تا 9شروع نميکنه بلکه از عددی که به خانه قبلی برگشته شروع ميکند
    به همين سرت توابعerror وslove چند بار اجرا ميشوند تا به خانه اخر برسد.
    من فقط ميخوام که اعدد ثابت هنگامی کهدر تابع error به عقب بر ميگرده سرجاش بمونه.
    اصلاً ميشه کاری کرد که عناصر آريه را يکجوری مثلا قفل کرد که محتوياتش تغیير نکنه

    //badaneh******************************************* ********
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    int checknum(int,int ,int);
    void slove(int ,int);
    void error(int,int);
    int sodoko[9][9];
    int main()
    {
    clrscr();
    int i,j;
    for(i=0;i<9;i++){
    for(j=0;j<9;j++)
    sodoko[i][j]=0;
    }
    sodoko[0][0]=1,sodoko[0][2]=4,sodoko[0][4]=5,sodoko[2][2]=5,sodoko[2][3]=1;
    sodoko[2][5]=2,sodoko[2][6]=9,sodoko[2][7]=7,sodoko[3][1]=4,sodoko[3][5]=5;
    sodoko[3][8]=6,sodoko[4][3]=7,sodoko[4][5]=6,sodoko[5][0]=3,sodoko[5][3]=2;
    sodoko[5][7]=9,sodoko[6][1]=6,sodoko[6][2]=8,sodoko[6][3]=5,sodoko[6][5]=9;
    sodoko[6][6]=1,sodoko[8][4]=8,sodoko[8][6]=5,sodoko[8][8]=3;
    slove(0,0);
    getch();
    return 0;
    }
    //slove********************************************* ****************
    void slove(int sa,int so)
    {

    if (sodoko[sa][so]!=0){
    if (sa==8 && so==8){
    for(int i=0;i<9;i++){
    for(int j=0;j<9;j++)
    printf("%4d",sodoko[i][j]);
    printf("\n");}
    getch();
    exit(1);}
    if (++so>8){
    sa++;
    so=0;}
    slove(sa,so);}
    else
    for (int in=1;in<=9;in++){
    if(checknum(sa,so,in)){
    sodoko[sa][so]=in;
    if(so==8 && sa==8){
    for(int i=0;i<9;i++){
    for(int j=0;j<9;j++)
    printf("%4d",sodoko[i][j]);
    printf("\n");}
    getch();
    exit(1);}
    if (++so>8){
    sa++;
    so=0;}
    slove(sa,so);}}
    error(sa,so);
    }
    //************************************************** **error
    void error(int sa,int so)
    {sodoko[sa][so]=0;
    if (so==0){
    sa--;
    so=8;}
    else
    so--;
    for (int in=sodoko[sa][so]+1;in<=9;in++){
    if(checknum(sa,so,in)){
    sodoko[sa][so]=in;
    if(so==8 && sa==8){
    for(int i=0;i<9;i++){
    for(int j=0;j<9;j++)
    printf("%4d",sodoko[i][j]);
    printf("\n");}
    getch();
    exit(1);}
    if (++so>8){
    sa++;
    so=0;}
    slove(sa,so);}}
    error(sa,so);
    }
    //checnum******************************************* *********
    int checknum (int sa,int so,int num)
    {
    //CHECK SATR
    for (int i=0;i<9;i++){
    if(sodoko[sa][i]==num){
    return 0;}}
    //check soton
    for (int j=0;j<9;j++)
    if(sodoko[j][so]==num){
    return 0;}
    //CHECK SQURE
    if(sa<3)
    sa=0;
    else if(sa>=3 && sa<6)
    sa=3;
    else
    sa=6;
    if (so<3)
    so=0;
    else if (so>=3 && so<6)
    so=3;
    else
    so=6;
    for (int m=0;m<3;m++){
    for (int n=0;n<3;n++){
    if(sodoko[sa+m][so+n]==num){
    return 0;}}}
    return 1;}

  2. #2

    نقل قول: سودکو

    کسی نمی تونه

  3. #3

    نقل قول: سودکو

    کسی نمی تونه

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •