#include <math.h>
#include <stdlib.h>
#include <string.h>
#include "OJ.h"
/*
功能: 求解放置8皇后方案的个数。
输入:
无
返回:
int:放置8皇后方案的个数
*/
int* gp_arr = NULL;
#define INITNUM -100
/*对棋盘进行初始化*/
void init(int queue)
{
int i = 0;
for (i = 0; i < queue; i++)
{
/*初始化为-1*/
gp_arr[i] = INITNUM;
}
}
/*判断该位置是否可以放置皇后
返回值: 0 不可以放置
1 可以放置
*/
int valid(int row, int col, int queue)
{
int i = 0;
for (i = 0; i < queue; i++)
{
/*判断列冲突和斜线上的冲突*/
if (gp_arr[i] == col || abs(i - row) == abs(gp_arr[i] - col))
{
return 0;
}
}
return 1;
}
int PlaceQueenMethodNum(int queue)
{
/*在这里实现功能*/
int n = 0;
int i = 0, j = 0;
int count = 0;
/*给棋盘分配空间*/
gp_arr = (int*)malloc(sizeof(int) * queue);
memset(gp_arr, 0, sizeof(int) * queue);
/*初始化这块内存*/
init(queue);
while (i < queue)
{
while (j < queue)
{
/*如果该位置可以放置皇后*/
if (valid(i, j, queue) == 1)
{
gp_arr[i] = j;
j = 0;
break;
}
else
{
j++;
}
}
/*第i行没有找到可以放置皇后的位置*/
if (gp_arr[i] == INITNUM)
{
if (i == 0)
{
break;
}
else
{
i--;
j = gp_arr[i] + 1;
gp_arr[i] = INITNUM;
continue;
}
}
/*最后一行找到了一个皇后位置,说明找到了一个结果*/
if (i == queue - 1)
{
count++;
j = gp_arr[i] + 1;
gp_arr[i] = INITNUM;
continue;
}
i++;
}
free(gp_arr);
return count;
}
华为OJ:N皇后
最新推荐文章于 2019-10-25 08:13:04 发布