八皇后問題 (C語言递归實現 回溯法)

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。現在要統計出所有的可行方案的總數,而且輸出每一種方案皇后擺放的坐標;

代碼詳細解析:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#define MAXN 8    //MAXN為最大皇后數,棋盤最大坐標
#define RST(N)memset(N, 0, sizeof(N))
using namespace std;

int queen[MAXN], res = 0; //記錄皇后所在的縱坐標,方案個數

void display()   //輸出一種可用方案所有皇后的坐標
{
    for(int i=0; i<MAXN; i++) {
        printf("(%d, %d)", i, queen[i]);
        i == MAXN-1 ? printf("\n") : printf(" ");
    }
    for(int i=0; i<55; i++) printf("~");
    printf("\n");
    res++;
}

bool check(int position) //判斷當前position之前的列是否能夠放置皇后
{
    for(int i=0; i<position; i++) {  //分別判斷當前列以及對角線是否有皇后佔用
        if(queen[i] == queen[position] || abs(queen[i]-queen[position]) == (position-i)) return false;
    }
    return true;
}

void put(int position)  //回溯,繼續嘗試皇后所在行的位置,position為橫坐標喔
{
    for(int i=0; i<MAXN; i++) {
        queen[position] = i;   //將皇后擺到當前行的不同列位置
        if(check(position)) {
            if(position == MAXN-1) display();  //全部擺好
            else put(position+1);  //繼續擺放下一個皇后
        }
    }
}

int main()
{
    put(0);   //從初始位置進行擺放
    printf("%d\n", res);   //輸出最後可行的方案總數
    return 0;
}
时间: 2024-10-22 09:04:58

八皇后問題 (C語言递归實現 回溯法)的相关文章

ASP.NET MVC 4.0 学习2-留言板實現

新增專案實現留言板功能,瞭解MVC的運行機制 1,新增專案   2,添加數據庫文件message.mdf   Ctrl+W,L 打開資料庫連接,添加存放留言的Atricle表 添加字段,後點擊"更新"後看到新增的Atricle表(Content 應該設置為text) 3,添加ADO.NET實體數據模型 (MVC通過實體數據模型對數據庫中的數據進行增删改查)              ADO.NET實體數據模型添加完成. 4,建立Service 我們把對Model中message.mdf

八皇后问题的两个高效的算法(回溯与递归)

序言 八皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击). 求解八皇后问题是算法中回溯法应用的一个经典案例 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法.回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试. 在现实中,有很多问题往往需要我们把其所有可能穷举出来,然后从中找出满足某种要求的可能或最优的情况,从而得到整个问题的解.回溯算法就是解决这种问题的“通用算法”,有“万能算法

[亂數] &lt;細說&gt; C/C++ 亂數基本使用與常見問題

陸陸續續寫了 EA  一.二年,以前亂數引導文回頭看時才發現,怎麼有這麼多細節的錯誤.沒系統. 這篇文章主要引導初學者使用亂數,同時附上常被翻出來討論的議題,C/C++適用,唯以 C 語言撰之. 也由於是引導初學者,所以在某些用詞上會較不正確, 像 compiler.IDE 會故意混為一談. 另外亂數原理也全都跳過 < 重點是亂數的產生原理也不只一種 >. 另本文附程式碼,不附執行結果,有興趣自己跑一遍. 最後請注意本文在區間表達裡,開區間與閉區間 括號的使用,也就是, [a, b]  ,  

关于八皇后问题

八皇后问题主要是关于实现递归程序方面的知识. 问题描述: 会下象棋的人都知道:皇后可以在横竖,斜线上不限步数的吃掉其他棋子,如何将八个皇后放在棋盘上,使他们谁都不被吃掉,这就是著名的八皇后问题.对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2....b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题有92组解.求出八皇后问题的所有解. 解题思路: 使用8*8矩阵作为模拟棋盘,以每一行为单位进行选择放置皇后,在放置皇后的同时将放置的皇后的控制范围画出,在

八皇后问题(回溯法&amp;枚举法)

作者 : 卿笃军 本文讨论了八皇后问题的三种解决方案: 一.枚举法 二.回溯法(递归版) 三.回溯法(非递归版) 本来这些代码是以前编写好的,没有发表,由于最近又学习到了八皇后问题,自己整理了一下发表了出来! 首先.说明一下何为八皇后问题,我也不去谷歌了,直接简单的说明一下: 八皇后问题,就是在一个8*8的平面棋盘上,要求你摆放8个棋子,要求:这8个棋子不能有2个在同一行,也不能有2个在同一列,同时一条斜线上面也不能有2个~~~~ 比如:4*4的棋盘,你可以这样摆放(4皇后问题): 以上图为参照

动态规划--八皇后

做了好多动态规划的题目,有了一些心得. public int getanswer(char[][] map,int index,int n) { if(index==n) {// index==n 则意味的递归结束 /*System.out.println("-------------"); for(int i=0;i<n;i++) { System.out.println(map[i]); }//打印一些 可行的排列 System.out.println("-----

何解決 LinqToExcel 發生「無法載入檔案或組件」問題何解決 LinqToExcel 發生「無法載入檔案或組件」問題

在自己的主機上透過 Visual Studio 2013 與 IISExpress 開發與測試都還正常,但只要部署到測試機或正式機,就是沒辦法順利執行,卡關許久之後找我協助.我發現錯誤訊息確實很「一般」,訊息是:「 無法載入檔案或組件 'LinqToExcel' 或其相依性的其中之一. 試圖載入格式錯誤的程式. 」或是英文版的「 Could not load file or assembly 'LinqToExcel' or one of its dependencies. An attempt

java实现八皇后问题(递归和循环两种方式)

循环方式: package EightQueens; public class EightQueensNotRecursive { private static final boolean AVAILABLE = true; private int squares = 8, norm = squares - 1; private int positionInRow[] = new int[squares]; private int p=-1; private boolean[] rows = n

C#中八皇后问题的递归解法——N皇后

百度测试部2015年10月份的面试题之——八皇后. 八皇后问题的介绍在此.以下是用递归思想实现八皇后-N皇后. 代码如下: using System;using System.Collections.Generic; namespace QueensSolution { class Program { static int count = 0; static void Main(string[] args) { int n = Int32.Parse(Console.ReadLine()); L