N
Niklaus
Hi,
Can someone point out what is wrong with this code ? How can i make
it better optimize it. When run it gives me seg fault in linux. But
windows it works fine(runs for a long time).
Do we have something like stack size growing enormously and then
saying you can't access ,so a segfault ?
It would be helpful if someone can run the code and give me the
output. It takes a long time on my PC.
Please give me comments about how to code better . This is just a hi-q
problem solved using brute force approach.
Here is the code.
------------BEGIN--------------------
#include<stdio.h>
#define SIZE 7
int a[SIZE][SIZE];
#define NOTVALID -1
#define HOLE 8
#define COIN 9
#define TRUE 1
#define FALSE 0
void
print_array (void)
{
int i, j;
for (i = 0; i < SIZE; i++)
{
printf ("\n");
for (j = 0; j < SIZE; j++)
printf (" %2c",
(a[j] == NOTVALID ? 32 : (a[j] == HOLE ? 48 : 49)));
}
printf ("\n#########################\n");
}
void
initialize (void)
{
int i, j;
for (i = 0; i < SIZE; i++)
for (j = 0; j < SIZE; j++)
a[j] = NOTVALID;
for (i = 2; i < 5; i++)
for (j = 0; j < SIZE; j++)
a[j] = COIN;
for (i = 0; i < SIZE; i++)
for (j = 2; j < 5; j++)
a[j] = COIN;
a[3][3] = HOLE;
}
int
within_l (int m, int n)
{
if (m < 0 || m > (SIZE - 1) || n < 0 || n > (SIZE - 1))
return FALSE;
if (a[m][n] == NOTVALID)
return FALSE;
return TRUE;
}
/* if i,j is a hole */
int
validposition1 (int i, int j)
{
if (within_l (i - 2, j) && (a[i - 1][j] == COIN) && a[i-2][j] ==
COIN )
return TRUE;
return FALSE;
}
int
validposition2 (int i, int j)
{
if (within_l (i + 2, j) && (a[i + 1][j] == COIN) && a[i+2][j] ==
COIN )
return TRUE;
return FALSE;
}
int
validposition3 (int i, int j)
{
if (within_l (i, j - 2) && (a[j - 1] == COIN) && a[j-2] ==
COIN )
return TRUE;
return FALSE;
}
int
validposition4 (int i, int j)
{
if (within_l (i, j + 2) && (a[j + 1] == COIN) && a[j+2] ==
COIN )
return TRUE;
return FALSE;
}
int isonlythat(void)
{
int i,j;
for(i=0;i<SIZE;i++)
for(j=0;j<SIZE;j++)
if(a[j] == COIN && (i!=3 ||j!=3))
return FALSE;
if(a[3][3] == HOLE)
return FALSE;
return TRUE;
}
void
hiq (int p, int q, int count)
{
int flag = 0, i, j, tmp;
// print_array();
if (validposition1 (p, q))
{
flag = 1;
a[p][q] = COIN;
a[p - 1][q] = HOLE;
a[p - 2][q] = HOLE;
hiq (p - 2, q, count + 1);
hiq (p - 1, q, count + 1);
a[p][q] = HOLE;
a[p - 1][q] = COIN;
a[p - 2][q] = COIN;
}
if (validposition2 (p, q))
{
flag = 1;
a[p][q] = COIN;
a[p + 1][q] = HOLE;
a[p + 2][q] = HOLE;
hiq (p + 2, q, count + 1);
hiq (p + 1, q, count + 1);
a[p][q] = HOLE;
a[p + 1][q] = COIN;
a[p + 2][q] = COIN;
}
if (validposition3 (p, q))
{
flag = 1;
a[p][q] = COIN;
a[p][q - 1] = HOLE;
a[p][q - 2] = HOLE;
hiq (p, q - 2, count + 1);
hiq (p, q - 1, count + 1);
a[p][q] = HOLE;
a[p][q - 1] = COIN;
a[p][q - 2] = COIN;
}
if (validposition4 (p, q))
{
flag = 1;
a[p][q] = COIN;
a[p][q + 1] = HOLE;
a[p + 2][q + 2] = HOLE;
hiq (p, q + 2, count + 1);
hiq (p, q + 1, count + 1);
a[p][q] = HOLE;
a[p][q + 1] = COIN;
a[p][q + 2] = COIN;
}
if (flag == 0)
{
tmp = 0;
for (i = 0; i < SIZE; i++)
for (j = 0; j < SIZE; j++)
if (a[j] == HOLE)
{
if (validposition1 (i, j) || validposition2 (i, j)
|| validposition3 (i, j) || validposition4 (i, j))
{
tmp = 1;
hiq (i, j, count + 1);
}
}
if (tmp == 0 )
{
if(isonlythat())
print_array ();
else
return;
}
else
return;
}
}
int
main ()
{
initialize ();
print_array ();
hiq (3, 3, 0);
return 0;
}
---------------------END--------------------
Can someone point out what is wrong with this code ? How can i make
it better optimize it. When run it gives me seg fault in linux. But
windows it works fine(runs for a long time).
Do we have something like stack size growing enormously and then
saying you can't access ,so a segfault ?
It would be helpful if someone can run the code and give me the
output. It takes a long time on my PC.
Please give me comments about how to code better . This is just a hi-q
problem solved using brute force approach.
Here is the code.
------------BEGIN--------------------
#include<stdio.h>
#define SIZE 7
int a[SIZE][SIZE];
#define NOTVALID -1
#define HOLE 8
#define COIN 9
#define TRUE 1
#define FALSE 0
void
print_array (void)
{
int i, j;
for (i = 0; i < SIZE; i++)
{
printf ("\n");
for (j = 0; j < SIZE; j++)
printf (" %2c",
(a[j] == NOTVALID ? 32 : (a[j] == HOLE ? 48 : 49)));
}
printf ("\n#########################\n");
}
void
initialize (void)
{
int i, j;
for (i = 0; i < SIZE; i++)
for (j = 0; j < SIZE; j++)
a[j] = NOTVALID;
for (i = 2; i < 5; i++)
for (j = 0; j < SIZE; j++)
a[j] = COIN;
for (i = 0; i < SIZE; i++)
for (j = 2; j < 5; j++)
a[j] = COIN;
a[3][3] = HOLE;
}
int
within_l (int m, int n)
{
if (m < 0 || m > (SIZE - 1) || n < 0 || n > (SIZE - 1))
return FALSE;
if (a[m][n] == NOTVALID)
return FALSE;
return TRUE;
}
/* if i,j is a hole */
int
validposition1 (int i, int j)
{
if (within_l (i - 2, j) && (a[i - 1][j] == COIN) && a[i-2][j] ==
COIN )
return TRUE;
return FALSE;
}
int
validposition2 (int i, int j)
{
if (within_l (i + 2, j) && (a[i + 1][j] == COIN) && a[i+2][j] ==
COIN )
return TRUE;
return FALSE;
}
int
validposition3 (int i, int j)
{
if (within_l (i, j - 2) && (a[j - 1] == COIN) && a[j-2] ==
COIN )
return TRUE;
return FALSE;
}
int
validposition4 (int i, int j)
{
if (within_l (i, j + 2) && (a[j + 1] == COIN) && a[j+2] ==
COIN )
return TRUE;
return FALSE;
}
int isonlythat(void)
{
int i,j;
for(i=0;i<SIZE;i++)
for(j=0;j<SIZE;j++)
if(a[j] == COIN && (i!=3 ||j!=3))
return FALSE;
if(a[3][3] == HOLE)
return FALSE;
return TRUE;
}
void
hiq (int p, int q, int count)
{
int flag = 0, i, j, tmp;
// print_array();
if (validposition1 (p, q))
{
flag = 1;
a[p][q] = COIN;
a[p - 1][q] = HOLE;
a[p - 2][q] = HOLE;
hiq (p - 2, q, count + 1);
hiq (p - 1, q, count + 1);
a[p][q] = HOLE;
a[p - 1][q] = COIN;
a[p - 2][q] = COIN;
}
if (validposition2 (p, q))
{
flag = 1;
a[p][q] = COIN;
a[p + 1][q] = HOLE;
a[p + 2][q] = HOLE;
hiq (p + 2, q, count + 1);
hiq (p + 1, q, count + 1);
a[p][q] = HOLE;
a[p + 1][q] = COIN;
a[p + 2][q] = COIN;
}
if (validposition3 (p, q))
{
flag = 1;
a[p][q] = COIN;
a[p][q - 1] = HOLE;
a[p][q - 2] = HOLE;
hiq (p, q - 2, count + 1);
hiq (p, q - 1, count + 1);
a[p][q] = HOLE;
a[p][q - 1] = COIN;
a[p][q - 2] = COIN;
}
if (validposition4 (p, q))
{
flag = 1;
a[p][q] = COIN;
a[p][q + 1] = HOLE;
a[p + 2][q + 2] = HOLE;
hiq (p, q + 2, count + 1);
hiq (p, q + 1, count + 1);
a[p][q] = HOLE;
a[p][q + 1] = COIN;
a[p][q + 2] = COIN;
}
if (flag == 0)
{
tmp = 0;
for (i = 0; i < SIZE; i++)
for (j = 0; j < SIZE; j++)
if (a[j] == HOLE)
{
if (validposition1 (i, j) || validposition2 (i, j)
|| validposition3 (i, j) || validposition4 (i, j))
{
tmp = 1;
hiq (i, j, count + 1);
}
}
if (tmp == 0 )
{
if(isonlythat())
print_array ();
else
return;
}
else
return;
}
}
int
main ()
{
initialize ();
print_array ();
hiq (3, 3, 0);
return 0;
}
---------------------END--------------------