#13279: [C]求助 記憶體區段錯誤


sos06096 (Ovuvuvuevue)

學校 : 國立臺北科技大學
編號 : 64498
來源 : [118.150.174.177]
最後登入時間 :
2020-04-05 15:46:16
a016. 數獨(SUDOKU) | From: [1.200.201.136] | 發表日期 : 2018-01-24 20:13

在我的dev-c++有跑出答案QQ

不知道爆在哪邊 QQ

 

想法是抓一個大小為9的整數陣列 把它初始為0

然後如果輸入是1就會在*r[0]的值設1

2就會在*r[1]的值設1 以此類推

如果陣列全是1輸出yes

反之輸出no

t = 0代表陣列全是1

t = 1就代表有錯

 

到底爆在哪 QQ

 

#include <stdio.h>


int check(int *);

int main()
{

int x, y, t, a, b;

while (1)
{

  int * arr = (int *)malloc(9 * 9 * sizeof(int));


  int * z = (int *)calloc(9, sizeof(int));


  int * r;

  t = 0;


  for (x = 0; x < 81; x++)

    scanf("%d", arr + x);

for (y = 0, r = arr ; y < 9; y++) //橫
{


for (x = 0; x < 9; x++)
{


*(z + *(r + 9 * y + x) - 1) = 1;


}

if ((t = check(z)) == 1)


break;


}

if (t == 1)
{


printf("no\n");
free(arr);
free(z);
continue;


}

for (x = 0, r = arr; x < 9; x++)
{


for (y = 0; y < 9; y++)
{


*(z + *(r + 9 * y + x) - 1) = 1;


}

if ((t = check(z)) == 1)


break;


}

if (t == 1)
{


printf("no\n");
free(arr);
free(z);
continue;


}

for (a = 0, r = arr; a < 3; a++)
{


if ((t == 1))


break;

 


for (b = 0; b < 3; b++)
{


for (x = 0; x < 3; x++)
{


for (y = 0; y < 3; y++)
{


*(z + *(r + 27 * a + 3 * b + x + 9 * y ) - 1) = 1;

}

}

if ((t = check(z)) == 1)
break;


}


}

if (t == 1)
{


printf("no\n");
free(arr);
free(z);
continue;


}


if (t == 0)
{


printf("yes\n");
free(arr);
free(z);
continue;

}


} //while end

return 0;


}

 

int check(int *x)
{


int *t = x;


int *p = x;


int i, j;

for (i = 0; *(t + i) == 1 && i < 9; i++)


continue;


for (j = 0; j < 9; j++)


*(p + j) = 0;


if (i == 9)


return 0;


else


return 1;

}

 
ZeroJudge Forum