c语言实现八皇后回溯算法

1.声明
源代码是参考了小甲鱼的数据结构和算法的,然后自己又实现了一遍。

2.代码块

#include<stdio.h>

int count = 0;//全局变量来记录八皇后的走法

int notDanger(int row, int j, int(*a)[8])
{
	int i,flag=0,k,flag2=0,flag3=0,flag4=0,flag5=0;
	//判断列有没有皇后= =
	for (i = 0; i < 8; i++)
	{
		if (*(*(a + i) + j) != 0)//如果有皇后那么就会提醒编译器别过去= =!
		{
			flag = 1;
			break;
		}
	}
	//判断左上方
	for (i = row, k = j; i >= 0 && k >= 0; i--,k--)
	{
		if (*(*(a + i) + k) != 0)
		{
			flag2 = 1;
			break;
		}
	}
	//判断右下方
	for (i = row, k = j; i <8 && k <8; i++, k++)
	{
		if (*(*(a + i) + k) != 0)
		{
			flag3 = 1;
			break;
		}
	}
	//判断左下方
	for (i = row, k = j; i < 8 && k >=0; i++, k--)
	{
		if (*(*(a + i) + k) != 0)
		{
			flag4 = 1;
			break;
		}
	}
	//判断右上方
	for (i = row, k = j; i >=0 && k <8; i--, k++)
	{
		if (*(*(a + i) + k) != 0)
		{
			flag5 = 1;
			break;
		}
	}
	if (flag || flag2 || flag3 || flag4 || flag5)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}

void eightqueen(int row,int n,int (*a)[8])//第八行的地址
{
	int a2[8][8], i, j;
	//第一次递归是初始化
	for (i = 0; i < 8; i++)
	{
		for (j = 0; j < 8; j++)
		{
			a2[i][j] = a[i][j];
		}
	}
	if (row == 8)//当到了第8行就返回,然后把值打印出来
	{
		count++;
		printf("第%d种成功:\n", count);
		for (i = 0; i < 8; i++)
		{
			for (j = 0; j < 8; j++)
			{
				printf("%d ", *(*(a2 + i) + j));
			}
			printf("\n");
		}
		printf("\n");
	}
	else//当row没到最后一行的时候
	{
		//判断是否被击中
		for (j = 0; j < n; j++)
		{
			if (notDanger(row, j, a))
			{
				for (i = 0; i < 8; i++)
				{
					*(*(a2 + row) + i) = 0;
				}
				*(*(a2 + row) + j) = 1;
				eightqueen(row + 1, n, a2);
			}
		}
	}
}

int main()
{
	int a[8][8],i,j;
	//先初始化为0
	for (i = 0; i < 8; i++)
	{
		for (j = 0; j < 8; j++)
		{
			a[i][j] = 0;
		}
	}
	eightqueen(0, 8, a);
	printf("八皇后算法总共有%d\n", count);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45859193/article/details/106313624