【题目】回溯-八皇后问题
本文最后更新于 32 天前,其中的信息可能已经有所发展或是发生改变。

题目链接

题目描述

一个如下的  的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。

上面的布局可以用序列 2 4 6 1 3 5 来描述,第 i 个数字表示在第 i 行的相应位置有一个棋子,如下:

行号 1 2 3 4 5 6

列号 2 4 6 1 3 5

这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。
并把它们以上面的序列方法输出,解按字典顺序排列。
请输出前 3 个解。最后一行是解的总个数。

代码演示

#include<iostream>
using namespace std;
int hang[100],lie[100],duijiao1[100],duijiao2[100];;
int N,sum=0;
void print()
{
	if(sum  <= 2){
		for(int i = 1; i <= N; i++){
			cout << hang[i] <<" ";
		}
		cout << endl;
	}
	sum++;
}

void queen(int i)
{
    if(i > N){
		print();
		return;
	}
	else{
		for(int j = 1; j <= N; j++){
			if((!lie[j]) &&(!duijiao1[i+j]) &&(!duijiao2[i-j+N])){
				hang[i] = j;
				lie[j] = 1;
				duijiao1[i+j] = 1;
				duijiao2[i-j+N] = 1;
				queen(i+1);
				lie[j] = 0;
				duijiao1[i+j] = 0;
				duijiao2[i-j+N] = 0;
			}
		}
	}
}

int main()
{
	cin >> N;
	queen(1);
	cout<<sum << endl;
	return 0;
} 

主要分析主体queen函数的回溯部分

1.i>N 意味着棋盘已经放满棋子;

2.而后else下面是记录j如hang中,lie duijiao12 是占位用的;

注意:关于回溯部分:1.return函数返回上一个召唤的函数

2.同时,也有当召唤的函数运行完了也会回到上一个召唤的函数。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇