八皇后问题 冷不防 2022-08-03 00:49 234阅读 0赞 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。试解出92种结果。 ![Center][] // eight_queen.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<deque> #include<iostream> using namespace std; #define N 8 typedef unsigned char BYTE; BYTE chess_board[N][N] = { 0 }; deque<deque<BYTE>>record, solution; deque<BYTE>cc; deque<BYTE>bb; bool update(int height) { cc.clear(); chess_board[height][bb[height]] = 1; for (int i = 0; i < N; i++) { chess_board[height][i] = 1; chess_board[i][bb[height]] = 1; if (height - bb[height] + i >= 0 && height - bb[height] + i <= N - 1) chess_board[height - bb[height] + i][i] = 1; if (height + bb[height] - i >= 0 && height + bb[height] - i <= N - 1)//右上左下 chess_board[height + bb[height] - i][i] = 1; } for (int i = 0; i < N; i++) if (chess_board[height + 1][i] == 0) cc.push_back(i); if (!cc.empty()) { return true; } return false; } void eight_queen() { for (int i = 0; i < N; i++) { bb.push_back(i); } record.push_back(bb); bb.clear(); int k = 0; while (k < N) { if (!record.empty()) { if (record[k].empty()) { while (record[k].empty()) { record.pop_back(); if (record.empty()) return; bb.pop_back(); k--; } for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) chess_board[i][j] = 0; for (int i = 0; i < k; i++) update(i); } bb.push_back(record[k][0]); record[k].pop_front(); } if (!update(k)) { while (!update(k)) { if (record[k].empty()) { while (record[k].empty()) { record.pop_back(); if (record.empty()) return; k--; for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) chess_board[i][j] = 0; for (int i = 0; i < k; i++) update(i); bb.pop_back(); } bb.pop_back(); break; } else { bb[k] = record[k][0]; record[k].pop_front(); for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) chess_board[i][j] = 0; for (int i = 0; i < k; i++) update(i); if (update(k)) { if (k == N - 2) { deque<BYTE> dd; dd = bb; dd.push_back(0); for (int i = 0; i < cc.size(); i++) { dd[N - 1] = cc[i]; solution.push_back(dd); } bb.pop_back(); for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) chess_board[i][j] = 0; for (int i = 0; i < k; i++) update(i); } else { record.push_back(cc); k++; } break; } } } } else { if (k == N - 2) { deque<BYTE> dd; dd = bb; dd.push_back(0); for (int i = 0; i < cc.size(); i++) { dd[N - 1] = cc[i]; solution.push_back(dd); } bb.pop_back(); for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) chess_board[i][j] = 0; for (int i = 0; i < k; i++) update(i); } else { record.push_back(cc); k++; } } } } int _tmain(int argc, _TCHAR* argv[]) { eight_queen(); system("pause"); return 0; } [Center]: /images/20220731/b2e4b6082c774b4183683a51572b7e17.png
相关 八皇后问题 八皇后问题 作者: Ackarlix 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯 1850 年提出:在 8X8 格的国际象棋上 灰太狼/ 2022年09月19日 15:20/ 0 赞/ 15 阅读
相关 八皇后问题 \include<stdio.h> \include<stdlib.h> \define max 8 int queen\[max\],s ﹏ヽ暗。殇╰゛Y/ 2022年08月07日 01:40/ 0 赞/ 176 阅读
相关 八皇后问题 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。试解出92种结果。 ![Cent 冷不防/ 2022年08月03日 00:49/ 0 赞/ 235 阅读
相关 八皇后问题 一、问题描述 ![Center][] 在8x8的国际棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能同一行、同一列、同一斜线上。 八皇后问题可以扩展为n ╰+哭是因爲堅強的太久メ/ 2022年07月14日 00:17/ 0 赞/ 198 阅读
相关 八皇后问题 回溯法求解八皇后问题 n皇后问题:n皇后问题是指在一个n\n的国际象棋棋盘上放置n个皇后,使得这n个皇后两两不在同一行,同一列,同一条对角线上,求合法的方案数。 如 小灰灰/ 2022年06月11日 08:49/ 0 赞/ 260 阅读
相关 八皇后问题 枚举法 include<iostream> using namespace std; int a[9]; int check(int n, 蔚落/ 2022年06月06日 00:38/ 0 赞/ 216 阅读
相关 八皇后问题 即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 由于皇后们是不能放在同一行的, 所以我们可以去掉“行”这个因素,即我第1次考虑把皇后放在第1行的某 柔情只为你懂/ 2022年05月28日 01:47/ 0 赞/ 219 阅读
相关 八皇后问题 在国际象棋中,皇后是最强大的一枚棋子,可以吃掉与其在同一行、列和斜线的敌方棋子.八皇后问题是这样一个问题:将八个皇后摆在一张8\8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇 Bertha 。/ 2022年05月18日 05:58/ 0 赞/ 215 阅读
相关 八皇后问题 include <iostream> include <cmath> include <cstring> using namespace std 港控/mmm°/ 2022年01月31日 00:29/ 0 赞/ 282 阅读
相关 八皇后问题 八皇后问题,以国际象棋为背景:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任意两个皇后都不能处于 叁歲伎倆/ 2021年09月25日 15:34/ 0 赞/ 446 阅读
还没有评论,来说两句吧...