八皇后问题详解(c++)

萌新题解 求过啊QaQ
看了诸多大大的题解 好长啊
鄙人尝试了一下 发现可以简单点~

八皇后问题详解
著名的八皇后问题是由棋手马克斯·贝瑟尔在1848年提出来的,要求在 8 × 8 的棋盘上摆放8个皇后,使”皇后“们不能互相攻击 ,当任意两个皇后都不处于同一行、同一列或同一条斜线上时就不会相互攻击,即为目标解。

例如下图:
在这里插入图片描述

读完上面的内容,想必您已经对此问题有了一定的认识,也就是我们需要在一个8 × 8的矩阵中摆放8个不在同一行,不在同一列,并且不在同一对角线上的棋子,计算出有多少种摆放的方法。

我们知道在一个矩阵中的同一个右对角线上所有元素的横坐标和纵坐标之和是一个定值,即横坐标与纵坐标之和,而同一左对角线上的所有元素的坐标也有特点,即都是纵坐标与横坐标的差值。可以看下图:
在这里插入图片描述

那么这个时候,就能够轻易的解决问题了,以下是我的代码:
蒟蒻开始写题解了······跪求各位神犇轻喷······

#include<bits/stdc++.h>
using namespace std;
int main()
{
	cout<<"92";
	return 0;
}

~
~
~
~
搞错了,再来(用深度优先搜索)

#include<bits/stdc++.h>
using namespace std;
int t=0;
int a[30],b[30],c[30];
void f(int i)
{
	for(int j=1;j<=8;j++)
	{
		if(a[j]==0&&b[i+j]==0&&c[j-i+8]==0)//分别是竖着、横着、斜着
		{
			if(i==8)
			t++;
			a[j]=1;//标记
			b[i+j]=1;
			c[j-i+8]=1;
			f(i+1);//进行下一个
			a[j]=0;
			b[i+j]=0;//取消标记
			c[j-i+8]=0;
		}
	}
}
int main()
{
	f(1);
	cout<<t;
	return 0;
}

王姐撒花————花
花 花 花花花花花花花花花花花花花花花花花花花花花花花花
花花花花花花花花花花花花花花花花花花花花花花花花花花花花
花花花花花花花花花花花花花花(还认识这个字吗)
那是因为……………………………………我懒 ,再说你该去写这道题了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值