完成後跑範例或是維基百科所附的數獨都是對的,卻還是WA,麻煩強者幫忙解題
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int num[81],s,i,j,k=0,t=0,z=0,x=0,u,n,f;
for(;scanf("%d",&num[0])!=EOF;){
for (i=1;i<81;i++){
scanf("%d",&num[i]);
}
for (j=0;j < 9;j++){
for (i=0;i < 9;i++)
{
s=i+(9*j);
x += num[s];
}
if (x != 45)
{
x=0;
k=1;
}
else if (x == 45)
{
k=0;
x=0;
}
}
for (j=0;j < 9;j++){
for (i=0;i<9;i++)
{
s=(9*(i)+j);
x += num[s];
}
if (x != 45)
{
t=1;
x=0;
}
else if (x == 45)
{
t=0;
x=0;
}
}
for (j=0;j < 9;j++){
for (i=0;i < 3;i++){
for (u=0;u < 3;u++){
s=(u+(9*i))+3*j;
if (j >=0 && j <=2)
f=s;
else if (j >= 3 && j<=5)
f=s+18;
else if (j>=6 && j<=8)
f=s+36;
x += num[f];
}
}
if (x != 45)
{
z=1,x=0;
}
else
{
z=0;
x=0;
}
}
if (t == 0 && k==0 && z==0)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
完成後跑範例或是維基百科所附的數獨都是對的,卻還是WA,麻煩強者幫忙解題
#include
#include
#include
int main()
{
int num[81],s,i,j,k=0,t=0,z=0,x=0,u,n,f;
for(;scanf("%d",&num[0])!=EOF;){
for (i=1;i<81;i++){
scanf("%d",&num[i]);
}
for (j=0;j < 9;j++){
for (i=0;i < 9;i++)
{
s=i+(9*j);
x += num[s];
}
if (x != 45)
{
x=0;
k=1;
}
else if (x == 45)
{
k=0;
x=0;
}
}
for (j=0;j < 9;j++){
for (i=0;i<9;i++)
{
s=(9*(i)+j);
x += num[s];
}
if (x != 45)
{
t=1;
x=0;
}
else if (x == 45)
{
t=0;
x=0;
}
}
for (j=0;j < 9;j++){
for (i=0;i < 3;i++){
for (u=0;u < 3;u++){
s=(u+(9*i))+3*j;
if (j >=0 && j <=2)
f=s;
else if (j >= 3 && j<=5)
f=s+18;
else if (j>=6 && j<=8)
f=s+36;
x += num[f];
}
}
if (x != 45)
{
z=1,x=0;
}
else
{
z=0;
x=0;
}
}
if (t == 0 && k==0 && z==0)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
時間複雜度太高了 想辦法簡化code O(n^3) 這麼高的時間複雜度基本上速度太慢 跑太多資料就慘了~
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int num[81],s,i,j,k=0,t=0,z=0,x=0,u,n,f;
for(;scanf("%d",&num[0])!=EOF;){
for (i=1;i<81;i++){
scanf("%d",&num[i]);
}
for (j=0;j < 9;j++){
for (i=0;i < 9;i++)
{
s=i+(9*j);
x += num[s];
}
if (x != 45)
{
x=0;
k=1;
goto end;
}
else if (x == 45)
{
k=0;
x=0;
}
}
for (j=0;j < 9;j++){
for (i=0;i<9;i++)
{
s=(9*(i)+j);
x += num[s];
}
if (x != 45)
{
t=1;
x=0;
goto end;
}
else if (x == 45)
{
t=0;
x=0;
}
}
for (j=0;j < 9;j++){
for (i=0;i < 3;i++){
for (u=0;u < 3;u++){
s=(u+(9*i))+3*j;
if (j >=0 && j <=2)
f=s;
else if (j >= 3 && j<=5)
f=s+18;
else if (j>=6 && j<=8)
f=s+36;
x += num[f];
}
}
if (x != 45)
{
z=1,x=0;
goto end;
}
else
{
z=0;
x=0;
}
}
end:
if (t == 0 && k==0 && z==0)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
我幫你改了一下程式碼 偷懶的用了goto 因為你的if 判斷到錯誤後 旗標變了1 不過沒有中斷他所以又繼續判斷下去 如果把最後一行 最後一列 最後一個九宮格 都放成正確的數字 就會發生 明明其他是錯的 你還是會判斷成對的
舉個範例給你看
123456781
123456782
123456747
123457814
151211515
151515158
151515123
151515456
123456789
明明是錯的 但是你原本的程式碼 卻輸出yes