您的位置:首页 > 产品设计 > UI/UE

八皇后问题--to be continued

2018-03-18 10:58 405 查看
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
using namespace std;
#define TRUE 1
#define FALSE 0

int nQueens_nonrecursive(int *a, int n)//递归法
{
int top, i, j, conflict;
top = -1;  //初始栈为空
i = 0;  //从第0行开始

do
{
conflict = FALSE;
for (j = 0; j < top + 1; j++)
{
if (i == a[j] || top + 1 - j == i - a[j] || top + 1 == a[j] - i)
{
conflict = TRUE;
}
}
if (conflict == FALSE)
{
a[++top] = i;  //把当前皇后放在第i列
if (top == n - 1)//problem solved
return TRUE;
i = 0;
}

else
{
while (i == n - 1 && top >= 0)//每次试探最后1列失败,就回溯一步
i = a[top--];
i++;
}
} while (i < n);
return FALSE;

}

int nQueens(int *a, int k, int n) //设有k个皇后放在前k行某k个不冲突的位置
//这些位置已经被数组a的前k个元素所记录
{
int i, j, conflict;
if (k == n)
return true;
for (i = 0; i < n; i++)
{
conflict = FALSE;
for (j = 0; j < k; j++)
{
//判断把第k+1个皇后放在第k+1行第i列会不会与前k个皇后发生冲突1
if (i == a[j] || k - j == i - a[j] || k - j == a[j] - i)
{
conflict = TRUE;
}
}
if (conflict == FALSE)
{
a[k] = i;//如果把第k+1个皇后放在第k+1行
if (nQueens(a, k + 1, n) == TRUE)
return TRUE;
}
}

return FALSE;
}

void printSolution(int *a, int n)
{
int i, j;
printf("\nPlace queens in the following positions:\n");
for (i = 0; i < n; i++)
{
printf("Row%3d-Col%3d: |", i, a[i]);
for (j = 0; j < a[i]; j++)
printf("|");
printf("Q|");
for (j = a[i]; j < n; j++)
printf("|");
printf("\n");
printf("\n");
}
}

int main()
{
int n, *a;
a = new int[100];
printf("Please enter an integer as the size of the problem:\n n=");
scanf_s("%d", &n);
if (n > 0)
a = (int *)malloc(n * sizeof(int));
else
{
printf("Error!Invalid input!\n");

}

if (nQueens_nonrecursive(a, n) == TRUE)
printSolution(a, n);
else
printf("Sorry!");
free(a);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐