PDA

View Full Version : سودکو



akbar_online
پنج شنبه 04 مهر 1387, 14:27 عصر
سلام من يک برنامه حل کننده سود کو نوشتم فقط نمی دونم اعداديی که بايد ثابت باشند چيکا ر کنم ثابت بمونن چون وقتی حل می کنه عدد ثابت هم جاشون عوض ميشه این برنامه به زبان 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;}

akbar_online
جمعه 05 مهر 1387, 12:36 عصر
کسی نمی تونه

akbar_online
شنبه 06 مهر 1387, 15:57 عصر
کسی نمی تونه