八皇后问题自我总结

八皇后

Description

在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。

Input

No
Output
输出所有八皇后问题的解
注解:在国际象棋中,皇后可以吃掉在同一行、列、斜线的其他的棋子。


        八皇后是一个经典的题目(作为一个菜鸟这是我碰到的比较难的一个题,所以自我总结一下,大佬请直接跳过)
        在本题中我使用的是c语言(菜鸟只会这个,还在学习中)。
        在整个代码中我用三个不同的函数(printarray,check,placeQueen)来解决问题,printarray用来输出最后的解,check用来检查当前放置的棋子是否符合题意,planeQueen(dfs)用来不停地放置棋子。
        我用一个一维数组来表示一个解,用printarray来翻译这个一维数组使其变成最后的答案。
                                                                   例:04752613:
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
        如上图所示:每一位数字都代表一行中第n+1位有一枚棋子,第一位数字为0,第一行的0+1位就表示有一个皇后。
        其中check函数中来检查当前放置的棋子是否正确,diff=abs(chess[row]-chess[i]),diff==0时代表有同一列有多个皇后,diff==row-i时代表在同一斜线上有多个皇后(因为在这个一维数组中每一位数代表一枚棋子的位置,所以不存在同一行有两个棋子)。
        placeQueen函数使用了dfs算法,chess[row]=i代表落入一个棋子,然后用check函数来检查对错,一旦错误这一路径将终结,正确将开始下一次计算,只有当row==N时,当前的一维数组才是正确的,用printarray函数来输出答案。
#include<stdio.h>
#include<math.h>
#define N 8
int chess[N];
int num=1;
int main(){
	void printarray(int[]);
	int check(int);
	void placeQueen(int);
	placeQueen(0);
	return 1;
}

void printarray(int data[8]){
	int i,j;
	printf("No.%2d:\n",num++);
	for(j=1;j<=N;j++){
	for(i=0;i<N;i++)
	if(i==data[j-1])printf("1 ");
	else printf("0 ");
	printf("\n");
	}
}

int check(int row){
	int i;
	for(i=0;i<row;i++){
		int diff=abs(chess[row]-chess[i]);
		if(diff==0||diff==row-i)return 0;
	}
	return 1;
}

void placeQueen(int row){
	int i;
	if(row==N){
		printarray(chess);
		return;
	}
	else for(i=0;i<N;i++){
		chess[row]=i;
		if(check(row))
		placeQueen(row+1);
	}
}
        如果有需要的朋友,可以转载本文。



 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值