當時大學新買的Nokia手機上有這個遊戲,玩着玩着突然想能不能寫個程式來解題,因為當時在學C語言,于是乎……
原文在QQ空間,現在整理到CSDN上供大家吐槽
先上代碼
#include<stdio.h>
#include<conio.h>
int str[][];
void output();
void main()
{
//定義
int i,j,k,num,flag=,count=;
int control=,con=;
int cishu=;
//輸入
printf("請輸入81個數,空位用“0”代替:\n");
for(i=;i<;i++)
{
for(j=;j<;j++)
{
scanf("%1d",&str[i][j]);
}
}
//處理
while(con==)
{
con=;
for(i=;i<;i++)
{
for(j=;j<;j++)
{
if(str[i][j]==)
{
//
//試值開始
for(num=;num<=;num++)
{
flag=;
//不同于九格
if(i%==&&j%==)
{
if(num!=str[i][j+]&&num!=str[i][j+]&&num!=str[i+][j]&&num!=str[i+][j+]&&num!=str[i+][j+]&&num!=str[i+][j]&&num!=str[i+][j+]&&num!=str[i+][j+])
{
flag=;
}
}
else if(i%==&&j%==)
{
if(num!=str[i][j+]&&num!=str[i][j-]&&num!=str[i+][j]&&num!=str[i+][j+]&&num!=str[i+][j-]&&num!=str[i+][j]&&num!=str[i+][j+]&&num!=str[i+][j-])
{
flag=;
}
}
else if(i%==&&j%==)
{
if(num!=str[i][j-]&&num!=str[i][j-]&&num!=str[i+][j]&&num!=str[i+][j-]&&num!=str[i+][j-]&&num!=str[i+][j]&&num!=str[i+][j-]&&num!=str[i+][j-])
{
flag=;
}
}
else if(i%==&&j%==)
{
if(num!=str[i][j+]&&num!=str[i][j+]&&num!=str[i+][j]&&num!=str[i+][j+]&&num!=str[i+][j+]&&num!=str[i-][j]&&num!=str[i-][j+]&&num!=str[i-][j+])
{
flag=;
}
}
else if(i%==&&j%==)
{
if(num!=str[i][j+]&&num!=str[i][j-]&&num!=str[i+][j]&&num!=str[i+][j+]&&num!=str[i+][j-]&&num!=str[i-][j]&&num!=str[i-][j+]&&num!=str[i-][j-])
{
flag=;
}
}
else if(i%==&&j%==)
{
if(num!=str[i][j-]&&num!=str[i][j-]&&num!=str[i+][j]&&num!=str[i+][j-]&&num!=str[i+][j-]&&num!=str[i-][j]&&num!=str[i-][j-]&&num!=str[i-][j-])
{
flag=;
}
}
else if(i%==&&j%==)
{
if(num!=str[i][j+]&&num!=str[i][j+]&&num!=str[i-][j]&&num!=str[i-][j+]&&num!=str[i-][j+]&&num!=str[i-][j]&&num!=str[i-][j+]&&num!=str[i-][j+])
{
flag=;
}
}
else if(i%==&&j%==)
{
if(num!=str[i][j+]&&num!=str[i][j-]&&num!=str[i-][j]&&num!=str[i-][j+]&&num!=str[i-][j-]&&num!=str[i-][j]&&num!=str[i-][j+]&&num!=str[i-][j-])
{
flag=;
}
}
else if(i%==&&j%==)
{
if(num!=str[i][j-]&&num!=str[i][j-]&&num!=str[i-][j]&&num!=str[i-][j-]&&num!=str[i-][j-]&&num!=str[i-][j]&&num!=str[i-][j-]&&num!=str[i-][j-])
{
flag=;
}
}
//不同與九格結束
//不同于行列檢測
if(flag==)
{
//不同于行
for(k=;k<;k++)
{
if(k!=i)
if(num==str[k][j])
{
control=;
}
}
//不同于列
if(control==)
for(k=;k<;k++)
{
if(k!=j)
if(num==str[i][k])
{
control=;
}
}
//不同于行列結束
}//不同于行列檢測結束
if((control==)&&(flag==))
{
str[i][j]=num;
count++;
}
control=;
}//試值結束
if(count>)
{
str[i][j]=;
}
count=;
}//if(str[i][j]==0)控制結束
}//每行中每列處理結束
}//每行處理結束
//檢測是否全部指派
for(i=;i<;i++)
for(j=;j<;j++)
{
if(str[i][j]==)
{
con=;
}
}
//分次輸出
printf("第%d次處理",++cishu);
output();
}//while(con)結束
//輸出
output();
//結束
getch();
}//main結束
void output()
{
int i,j;
printf("答案為:\n");
for(i=;i<;i++)
{
for(j=;j<;j++)
{
printf(" %d ",str[i][j]);
}
printf("\n");
}
}
别罵街,畢竟當時大一……
思路
- 輸入:有數寫數,空寫0
-
循環中以0為控制條件,如果a[i][j]==0進行操作。
if(a[i][j]==0)
-
每行每列都不同
a[i][j]!=a[i][m]&&a[i][j]!=a[m][j]
-
每九個數不同
如果行号對三求餘 且列号對三求餘
-
如果一個位置被連續兩次或以上指派,歸零
用count++來控制
- 測試用資料
0 7 0 3 0 4 0 6 0
0 4 0 0 5 0 1 0 8
3 0 0 9 0 1 4 2 7
0 2 8 0 0 5 3 0 0
0 6 9 0 0 2 7 4 0
0 0 5 1 0 6 9 0 0
2 0 3 0 1 9 0 0 4
6 0 0 0 0 3 0 0 1
0 0 0 7 0 8 2 0 0