八皇后问题求解-C语言

程序演示结果

1种方案:0 4 7 5 2 6 1 32种方案:0 5 7 2 6 3 1 43种方案:0 6 3 5 7 1 4 24种方案:0 6 4 7 1 3 5 25种方案:1 3 5 7 2 0 6 46种方案:1 4 6 0 2 7 5 37种方案:1 4 6 3 0 7 5 28种方案:1 5 0 6 3 7 2 49种方案:1 5 7 2 0 3 6 410种方案:1 6 2 5 7 4 0 311种方案:1 6 4 7 0 3 5 212种方案:1 7 5 0 2 4 6 313种方案:2 0 6 4 7 1 3 514种方案:2 4 1 7 0 6 3 515种方案:2 4 1 7 5 3 6 016种方案:2 4 6 0 3 1 7 517种方案:2 4 7 3 0 6 1 518种方案:2 5 1 4 7 0 6 319种方案:2 5 1 6 0 3 7 420种方案:2 5 1 6 4 0 7 321种方案:2 5 3 0 7 4 6 122种方案:2 5 3 1 7 4 6 023种方案:2 5 7 0 3 6 4 124种方案:2 5 7 0 4 6 1 325种方案:2 5 7 1 3 0 6 426种方案:2 6 1 7 4 0 3 527种方案:2 6 1 7 5 3 0 428种方案:2 7 3 6 0 5 1 429种方案:3 0 4 7 1 6 2 530种方案:3 0 4 7 5 2 6 131种方案:3 1 4 7 5 0 2 632种方案:3 1 6 2 5 7 0 433种方案:3 1 6 2 5 7 4 034种方案:3 1 6 4 0 7 5 235种方案:3 1 7 4 6 0 2 536种方案:3 1 7 5 0 2 4 637种方案:3 5 0 4 1 7 2 638种方案:3 5 7 1 6 0 2 439种方案:3 5 7 2 0 6 4 140种方案:3 6 0 7 4 1 5 241种方案:3 6 2 7 1 4 0 542种方案:3 6 4 1 5 0 2 743种方案:3 6 4 2 0 5 7 144种方案:3 7 0 2 5 1 6 445种方案:3 7 0 4 6 1 5 246种方案:3 7 4 2 0 6 1 547种方案:4 0 3 5 7 1 6 248种方案:4 0 7 3 1 6 2 549种方案:4 0 7 5 2 6 1 350种方案:4 1 3 5 7 2 0 651种方案:4 1 3 6 2 7 5 052种方案:4 1 5 0 6 3 7 253种方案:4 1 7 0 3 6 2 554种方案:4 2 0 5 7 1 3 655种方案:4 2 0 6 1 7 5 356种方案:4 2 7 3 6 0 5 157种方案:4 6 0 2 7 5 3 158种方案:4 6 0 3 1 7 5 259种方案:4 6 1 3 7 0 2 560种方案:4 6 1 5 2 0 3 761种方案:4 6 1 5 2 0 7 362种方案:4 6 3 0 2 7 5 163种方案:4 7 3 0 2 5 1 664种方案:4 7 3 0 6 1 5 265种方案:5 0 4 1 7 2 6 366种方案:5 1 6 0 2 4 7 367种方案:5 1 6 0 3 7 4 268种方案:5 2 0 6 4 7 1 369种方案:5 2 0 7 3 1 6 470种方案:5 2 0 7 4 1 3 671种方案:5 2 4 6 0 3 1 772种方案:5 2 4 7 0 3 1 673种方案:5 2 6 1 3 7 0 474种方案:5 2 6 1 7 4 0 375种方案:5 2 6 3 0 7 1 476种方案:5 3 0 4 7 1 6 277种方案:5 3 1 7 4 6 0 278种方案:5 3 6 0 2 4 1 779种方案:5 3 6 0 7 1 4 280种方案:5 7 1 3 0 6 4 281种方案:6 0 2 7 5 3 1 482种方案:6 1 3 0 7 4 2 583种方案:6 1 5 2 0 3 7 484种方案:6 2 0 5 7 4 1 385种方案:6 2 7 1 4 0 5 386种方案:6 3 1 4 7 0 2 587种方案:6 3 1 7 5 0 2 488种方案:6 4 2 0 5 7 1 389种方案:7 1 3 0 6 4 2 590种方案:7 1 4 2 0 6 3 591种方案:7 2 0 5 1 4 6 392种方案:7 3 0 2 5 1 6 4
方案种数:92

--------------------------------
每行的第m个数字n表示皇后在第m行第n+1列,如第92中方案的第一个数字7表示
这种方案的第一个皇后在第八列。

源程序

#include
#include
#define N 8
int result[N]={0};
int index=0;
int count=0;

int isRight(int r[],int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		if(r[i]==r[n]||abs(r[i]-r[n])==abs(i-n))
		{
			return 0;
		}
	}
	return 1;
}

void display(int r[],int n)
{
	int i;
	printf("第%d种方案:",count);
	for(i=0;i<n;i++)
	{
		printf("%d ",r[i]);
	}
	printf("\n");
}

void backtrace(int r[],int n)
{
	if(n>=N)
	{
		count++;
		display(r,n);
		return;
	}
	int i;
	for(i=0;i<N;i++)
	{
		r[n]=i;
		if(isRight(r,n))
		{
			backtrace(r,n+1);
		}
	}
}

int main()
{
	backtrace(result,0);
	printf("方案种数:%d\n",count);
	return 0;
}

设计思路

  1. 本题目用一维数组即可,不需要二维,可以降低复杂度。
  2. 一维数组中任一元素arr[i]存储第i+1行中皇后该放的位置。
  3. 运用好递归算法有助于代码的实现。
  4. 判断第n+1行皇后放的位置是否合法,需要跟前面的进行对比,如果和前面已经放的位置同列,即arr[n]是否等于arr[i],其中i属于0~n-1;同时皇后可以斜着吃子,所以还需要判断n-i的绝对值是否等于arr[n]-arr[i]的绝对值,我们将国际象棋棋盘想象出来,如果第i行的皇后位置和第n行的皇后位置形成的直线与最上边的线成45%斜率,则他们可以相互攻击!
  5. 最后别忘了递归算法需要出口!

你可能感兴趣的:(算法,C语言控制台游戏入门,算法,数据结构,递归法,c语言)