Код:
#include <stdio.h>
#pragma warning (disable:4996)
FILE* end_file;
int n, active_n, standing_n,s=0;//размер поля, кол-во фигур для постановки, кол-во фигур уже стоящих,счётчик вариантов
int board[24][24] = {0};
int x_line[24] = {0};//строки которые бьются
int y_line[24] = {0};//столбцы которые бьютя
int main_digonal[47] = {0};//диагонали подобные главной ,которые бьются
int off_diagonal[47] = {0};//диагонали подобные побочной,который бьются
int Horse(int x, int y)
{
int x_horse_move[8] = { 2, 2, 1, 1,-2, -2, -1, -1 };// ходы
int y_horse_move[8] = { 1, -1, 2, -2, 1, -1, 2, -2 };// коня
int i;
for (i = 0; i < 8; i++)
{
if (board[x + x_horse_move[i]][y + y_horse_move[i]] != 0) return 1;
}
return 0;
}
int maharajah(int S,FILE **F)
{
int i, j, f, g;
if (S == 0)
{
int flag=0,stop=0;
for (i = n-1; i >-1; i--)
{
for (j = n-1; j >-1; j--)
{
if ((board[i][j] != 0) && (board[i][j] != -1) && (board[i][j] == flag + 1)) flag = board[i][j];
else if ((board[i][j] != 0) && (board[i][j] != -1) && (board[i][j] != flag + 1)) stop = 1;
}
}
if (stop == 0)
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (board[i][j] != 0) fprintf(*F, "(%d,%d) ", i, j);
}
}
fputc('\n',*F);
s++;
}
return 0;
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if ((board[i][j] == 0) && (x_line[i] == 0) && (y_line[j] == 0) && (main_digonal[4 - i + j] == 0) && (off_diagonal[8 - i - j] == 0) && (Horse(i, j) == 0))
{
board[i][j] = S;
x_line[i] = 1;
y_line[j] = 1;
main_digonal[4 - i + j] = 1;
off_diagonal[8 - i - j] = 1;
if (maharajah(S - 1,F) == 0)
{
for (f = 0; f < n; f++)
{
for (g = 0; g < n; g++)
{
if (board[f][g] == S) board[f][g] = 0;
}
}
x_line[i] = 0;
y_line[j] = 0;
main_digonal[4 - i + j] = 0;
off_diagonal[8 - i - j] = 0;
}
}
}
}
return 0;
}
int main()
{
int i, x, y, j;
FILE* start_file, * end_file;
start_file = fopen("input.txt","r");
end_file = fopen("output.txt","w");
fscanf(start_file,"%d %d %d",&n,&active_n,&standing_n );//размер поля, кол-во фигур для постановки, кол-во фигур уже стоящих
//Постановка изначальных/standing_n магардж
for (i = 0; i < standing_n; i++)
{
fscanf(start_file,"%d" "%d",&x,&y);
board[x][y] = -1;//Позиция занята начальной магараджей
x_line[x] = 1;// x линия бьётся
y_line[y] = 1;// y линия бьётся
main_digonal[4 - x + y] = 1;// бьётся диагональ подобная главной
off_diagonal[8 - x - y] = 1;// бьётся диагональ подобная побочной
}
if (active_n == 1)
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if ((board[i][j] == 0) && (x_line[i] == 0) && (y_line[j] == 0) && (main_digonal[4 - i + j] == 0) && (off_diagonal[8 - i - j] == 0) && (Horse(i, j) == 0))
{
fprintf(end_file, "(%d,%d)\n", i, j);
s++;
}
}
}
}
else maharajah(active_n, &end_file);
if (s == 0) fprintf(end_file, "no solutions");
fclose(start_file);
fclose(end_file);
}