The program crashes.It says stack overflow.
Please help me make it right.
Code:
#include<iostream>
using namespace std;
static int grid[9][9];
void input();
void output();
void init();
bool solve();
bool is_safe(int,int,int);
bool unassigned(int&,int&);
int main()
{
init();
if (solve())
output();
else
cout << "No solution\n";
}
void input()
{
int i, j;
for (i = 0; i < 9; i++)
{
cout << "enter row " << i + 1 << " values:\n";
for (j = 0; j < 9; j++)
{
cin >> grid[i][j];
while (grid[i][j]<0 || grid[i][j]>9)
{
cout << "invalid value.enter again : ";
cin >> grid[i][j];
}
}
}
}
void output()
{
int i, j;
for (i = 0; i<9; i++)
{
cout << '\t';
if (i == 3 || i == 6)
cout << "-----------\n\t";
for (j = 0; j<9; j++)
{
if (j == 3||j==6)
cout << '|';
cout << grid[i][j];
}
cout << endl;
}
}
void init()
{
char ans;
do
{
input();
output();
cout << "is it correct (y/n) ? "; cin >> ans;
if (ans == 'y' || ans == 'Y')break;
cout << "Please try again.\n";
} while (true);
}
bool solve()
{
int k;
int row, col;
if (!unassigned(row,col))
return true;
for (k = 1; k <= 9; k++)
{
if(is_safe(row, col, k))
grid[row][col]=k;
if (solve())
return true;
grid[row][col] = 0;
}
return false;
}
bool is_safe(int a, int b,int k)
{
int x, y, i, j;
for (i = a, j = 0; j < 9; j++)
{
if (grid[i][j] == k)
return false;
}
for (j = b, i = 0; i < 9; i++)
{
if (grid[i][j] == k)
return false;
}
if (a < 3 && b < 3)
{
for (x = 0; x < 3; x++)
for (y = 0; y < 3; y++)
{
if (grid[x][y] == k)
return false;
}
return true;
}
else if (a < 3 && b < 6)
{
for (x = 0; x < 3; x++)
for (y = 3; y < 6; y++)
{
if (grid[x][y] == k)
return false;
}
return true;
}
else if (a < 3 && b < 9)
{
for (x = 0; x < 3; x++)
for (y = 6; y < 9; y++)
{
if (grid[x][y] == k)
return false;
}
return true;
}
else if (a < 6 && b < 3)
{
for (x = 3; x < 6; x++)
for (y = 0; y < 3; y++)
{
if (grid[x][y] == k)
return false;
}
return true;
}
else if (a < 6 && b < 6)
{
for (x = 3; x < 6; x++)
for (y = 3; y < 6; y++)
{
if (grid[x][y] == k)
return false;
}
return true;
}
else if (a < 6 && b < 9)
{
for (x = 3; x < 6; x++)
for (y = 6; y < 9; y++)
{
if (grid[x][y] == k)
return false;
}
return true;
}
else if (a < 9 && b < 3)
{
for (x = 6; x < 9; x++)
for (y = 0; y < 3; y++)
{
if (grid[x][y] == k)
return false;
}
return true;
}
else if (a < 9 && b < 6)
{
for (x = 6; x < 9; x++)
for (y = 3; y < 6; y++)
{
if (grid[x][y] == k)
return false;
}
return true;
}
else if (a < 9 && b < 9)
{
for (x = 6; x < 9; x++)
for (y = 6; y < 9; y++)
{
if (grid[x][y] == k)
return false;
}
return true;
}
}
bool unassigned(int & i,int & j)
{
for (i = 0; i<9; i++)
for (j = 0; j<9; j++)
if (grid[i][j]==0)
{
return true;
}
return false;
}