📄 sudoku.c
字号:
#include "stdio.h"
#include<conio.h>
/*
int Sudoku[9][9] = {
{0,2,0,0,0,6,0,4,0},
{5,0,0,0,8,1,0,7,0},
{4,8,1,0,0,9,0,0,0},
{9,0,0,8,0,0,0,1,4},
{0,7,0,9,2,0,6,0,0},
{8,4,0,6,0,7,0,3,9},
{2,0,0,7,4,0,3,9,6},
{0,0,4,3,0,0,1,2,0},
{3,0,0,1,0,2,0,5,8}
};
*/
/*
int Sudoku[9][9] = {
{0,7,4,0,0,0,8,0,0},
{1,0,0,0,7,5,0,0,6},
{0,0,8,0,2,0,0,0,3},
{5,3,0,0,0,1,6,0,0},
{7,0,2,0,0,0,4,0,9},
{0,0,6,7,0,0,0,3,5},
{8,0,0,0,6,0,3,0,0},
{3,0,0,9,4,0,0,0,2},
{0,0,5,0,0,0,7,6,0}
};
*/
int Sudoku[9][9] = {
{1,0,0,9,0,2,0,0,3},
{0,0,0,6,4,1,0,0,0},
{0,7,0,0,0,0,0,1,0},
{4,1,0,0,0,0,0,9,8},
{2,6,0,4,0,3,0,7,1},
{3,8,0,0,0,0,0,2,6},
{0,9,0,0,0,0,0,8,0},
{0,0,0,3,5,8,0,0,0},
{5,0,0,7,0,6,0,0,4}
};
/* Rowcheck,columncheck and boxcheck arrays */
int rckarr[10],cckarr[10],bckarr[10];
//int prevk;
//*/
/* OR */
/*
int sudoku[9][9];
get_sudoku()
{ int i,j;
printf(" Enter the sudoku row-wise \n");
// int i,j;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
scanf("%d",&sudoku[i][j]);
return;
}
*/
disp_sudoku()
{ int i,j;
for(i=0;i<9;i++)
{ for(j=0;j<9;j++)
printf(" %d ",Sudoku[i][j]);
printf("\n\n");
}
return;
}
get_rckarr(a)
int a;
{ int m;
for(m=1;m<=9;m++)
rckarr[m] = 1;
for(m=0;m<9;m++)
{ if(Sudoku[a][m])
rckarr[(Sudoku[a][m])] = 0;
}
return;
}
get_cckarr(b)
int b;
{ int m;
for(m=1;m<=9;m++)
cckarr[m] = 1;
for(m=0;m<9;m++)
{ if(Sudoku[m][b])
cckarr[(Sudoku[m][b])] = 0;
}
return;
}
get_bckarr(a,b)
int a,b;
{
int a1,b1;
for(a1=1;a1<=9;a1++)
bckarr[a1] = 1;
for(a1=a;a1<=a+2;a1++)
{ for(b1=b;b1<=b+2;b1++)
{ if(Sudoku[a1][b1])
bckarr[(Sudoku[a1][b1])] = 0;
}
}
return;
}
getnum()
{ int i,j;
int k=0;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
{
if(Sudoku[i][j]==0)
k++;
}
return k;
}
int main()
{ int flag,ck;
int i,j,x,i1,j1,k,prevk;
clrscr();
// get_sudoku();
printf("\t\t\t\tSu|do|ku\n\n\n");
disp_sudoku();
do{
prevk = getnum();
for(i=0;i<9;i++)
{ for(j=0;j<9;j++)
{ if(Sudoku[i][j]==0)
{ ck=0;
get_rckarr(i); /* Get the Rowcheck array */
get_cckarr(j); /* Get the Colcheck array */
if((i<3) && (j<3)) { i1=0;j1=0;}
else if((i<3) && (j>2) && (j<6)) { i1=0;j1=3;}
else if((i<3) && (j>5)) { i1=0;j1=6;}
else if((i>2) && (i<6) && (j<3)) { i1=3;j1=0;}
else if((i>2) && (i<6) && (j>2) && (j<6)) { i1=3;j1=3;}
else if((i>2) && (i<6) && (j>5)) { i1=3;j1=6;}
else if((i>5) && (j<3)) { i1=6;j1=0;}
else if((i>5) && (j>2) && (j<6)) { i1=6;j1=3;}
else { i1=6;j1=6;}
get_bckarr(i1,j1); /* Get the Boxcheck array */
for(x=1;x<=9;x++)
{ if((rckarr[x] ==1)&&(cckarr[x] ==1)&&(bckarr[x] ==1))
{ck++;
flag=x;
}
}
if(ck==1)
{ Sudoku[i][j] = flag;
flag=0;}
}
}
}
k = getnum();
} while( k!=0 && k !=prevk);
/* To check Each Row for Single zero */
do{
prevk = getnum();
for(i=0;i<9;i++)
{ get_rckarr(i);
ck=0; flag=0;
for(x=1;x<=9;x++)
{ if(rckarr[x]==1)
{ ck++;
flag = x;
}
}
if(ck==1)
{ for(j=0;j<9;j++)
if(Sudoku[i][j]==0)
Sudoku[i][j]=flag;
}
}
k = getnum();
} while( k!=0 && k !=prevk);
/* To check Each Column for Single zero */
do{
prevk = getnum();
for(j=0;j<9;j++)
{ get_cckarr(j);
ck=0; flag=0;
for(x=1;x<=9;x++)
{ if(cckarr[x]==1)
{ ck++;
flag = x;
}
}
if(ck==1)
{ for(i=0;i<9;i++)
if(Sudoku[i][j]==0)
Sudoku[i][j]=flag;
}
}
k = getnum();
} while( k!=0 && k !=prevk);
printf("\n\nSolution\n\n\n");
disp_sudoku();
getch();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -