그래서 N 개의 퀸 문제의 수정 된 버전을 수행해야합니다. 여기서 우리는 폰으로 채워진 체스 보드의 초기 구성이 주어지며 우리는 가능한 최대 수의 퀸을 찾아야합니다 그들은 서로 공격하지 않도록해야합니다. 입력은 보드의 치수 (NxN)를 나타내는 첫 번째 줄의 정수와 체스 보드 설정을 정의하는 n 개의 라인으로 구성됩니다. 문자는 'p'(이미 해당 위치에 폰이 있음을 의미) 또는 'e'(위치가 비어 있음을 의미). N 퀸으로 잘못된 출력
5
epepe
ppppp
epepe
ppppp
epepe
출력이 여기에 9
될 것입니다 예를 들어
,이 입력에 대한, 내 코드는 모든 것이 명확 보이지만 정확한 출력을 제공 나던 왜 표시되지 않습니다
#include <stdio.h>
#include <malloc.h>
/* function headers */
void do_case(int);
int solve(char **,int,int);
int canPlace(char **,int,int,int);
/* Global vars */
int queens;
int main(void)
{
int n;
scanf("%d",&n);
getchar();
while(n != 0)
{
do_case(n);
scanf("%d",&n);
getchar();
}
return 0;
}
void do_case(int n)
{
int i,j; //counters for input
//board configuration allocation
char **configuration = (char **)malloc(n*sizeof(char *));
for(i = 0 ; i < n ;i++)
configuration[i] =(char *)malloc(n*sizeof(char));
queens = 0;
//get input
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
scanf("%c",&configuration[i][j]);
}
getchar();
}
//solve
solve(configuration,n,0);
printf("%d \n",queens);
}
//recursive solver
int solve(char **configuration,int N,int col)
{
int i,j;
//base case
if(col >= N)
return 1;
//consider this column
//try placing queen in non blocked spot in all rows
for(i = 0; i < N; i++)
{
if (configuration[i][col] == 'e' && canPlace(configuration,N,i,col))
{
//Place queen in configuration[i][col]
configuration[i][col] = 'q';
queens++;
//recursion on the rest
if(solve(configuration,N,col + 1) == 1)
{
return 1;
}
//backtrack
configuration[i][col] = 'e';
queens--;
}
}
return 0;
}
//this function check if queen can be placed
int canPlace(char **configuration,int N, int row, int col)
{
int i, j;
/* Check this row on left side */
for (i = 0; i < col; i++)
{
if (configuration[row][i] == 'q')
{
return 0;
}
}
/* Check upper diagonal on left side */
for (i = row, j = col; i >= 0 && j >= 0; i--, j--)
{
if (configuration[i][j] == 'q')
{
return 0;
}
}
/* Check lower diagonal on left side */
for (i = row, j = col; j >= 0 && i < N; i++, j--)
{
if (configuration[i][j] == 'q')
{
return 0;
}
}
return 1;
}
'canPlace()'또는 왼쪽 상단의 열에 대한 확인이 없습니다. – chux