8皇后傻瓜解法

#include <stdio.h>

int a[8][8] = {0};
int count = 0;

void Queen(int row);
int notdanger(int row, int col);

int main()
{
	Queen(0);
	return 0;
}

void Queen(int row)
{
	int i, j, k[8], m = 0,r=0;
	int b, c;

	for (j = 0; j < 8; j++)
	{
		if (notdanger(row, j))
		{
			k[row] = j;
			a[row][j] = 1;
			row++;
			j = -1;
			if (row == 8)
			{
				count++;
				printf("第%d种:\n",count);		//8皇后解法输出
				for (b = 0; b < 8; b++)
				{
					for (c = 0; c < 8; c++)
					{
						printf("%d ", a[b][c]);
					}
					printf("\n");
				}
				printf("\n\n");

				m = 1;		//该行有解,退行找另解
				if (k[row - 1] == 7)
				{
					m++;
				}
				while (m--)
				{
					row--;
					j = k[row];
					a[row][j] = 0;
				}
			}
		}
		else if (j == 7)
		{
			m = 1;		//遍历该行无解,退行找解
			if (k[row - 1] == 7)
			{
				m++;
			}
			while (m--)
			{
				row--;
				if (row < 0)
				{
					exit(0);
				}
				j = k[row];
				a[row][j] = 0;
			}
		}
	}
}

int notdanger(int row,int col)
{
	int i,j;
	int flag1 = 1, flag2 = 1, flag3 = 1, flag4 = 1, flag5 = 1, flag6 = 1;
	for (i = 0; i < 8; i++)
	{
		if (a[i][col])
		{
			flag1 = 0;
			break;
		}
	}
	for (j = 0; j < 8; j++)
	{
		if (a[row][j])
		{
			flag2 = 0;
			break;
		}
	}
	for (i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--)
	{
		if (a[i][j])
		{
			flag3 = 0;
			break;
		}
	}
	for (i = row - 1, j = col + 1; i >= 0 && j < 8; i--, j++)
	{
		if (a[i][j])
		{
			flag4 = 0;
			break;
		}
	}
	for (i = row + 1, j = col - 1; i < 8 && j >= 0; i++, j--)
	{
		if (a[i][j])
		{
			flag5 = 0;
			break;
		}
	}
	for (i = row + 1, j = col + 1; i < 8 && j < 8; i++, j++)
	{
		if (a[i][j])
		{
			flag6 = 0;
			break;
		}
	}
	if (flag1 && flag2 && flag3 && flag4 && flag5 && flag6)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43837914/article/details/86563242
今日推荐