國際象棋“皇后”問題的回溯演算法
//國際象棋“皇后”問題處理標頭檔案
//國際象棋“皇后”問題的回溯演算法
/*
作者:成曉旭
時間:2001年10月9日(17:35:38-18:00:00)
內容:完成“皇后”問題的程式序言部分
時間:2001年10月9日(14:00:00-15:00:00)
內容:完成“皇后”問題的程式序言部分
===================================================
問題描述:
在一個n*n的棋盤上放置n個不能互相捕捉的國際象棋“皇后”,
並輸出所有合理的佈局情況.(在國際象棋中,皇后可以沿著縱、橫
及兩條斜線共4個方向捕捉對手,可見,合適的解是在每行、每列及
在一條斜線上只能有一個皇后<皇后相互捕捉>)
程式設計思想:
演算法描述:
{
輸入棋盤大小值n;
m=0; //從空配置開始
notcatch=1; //空配置中皇后不能相互捕捉
do
{
if(notcatch)
{
if(m==n)
{
輸出解;
調整(形成下一個候選解);
}
else
擴充套件當前候選解至下一列; //向前試探
}
else
調整(形成下一個候選解); //向後回溯
notcatch = 檢查當前候選解的合理性
}while(m!=0)
}
*/
#include "stdlib.h"
#define MAXN 100
//全域性變數及全域性工作陣列定義
int m,n,NotCatch;
int ColFlag[MAXN+1]; /*表示第i列的第ColFlag[i]行有皇后,(1:有;0:沒有)*/
int RowFlag[MAXN+1]; /*RowFlag[i]:表示第i行沒有皇后(1:沒有;0:有)*/
int upBiasFlag[2*MAXN+1]; /*upBiasFlag[i]:表示第i條上斜線(右高左斜)沒有皇后(1:沒有;0:有)*/
int dnBiasFlag[2*MAXN+1]; /*dnBiasFlag[i]:表示第i條下斜線(左高右斜)沒有皇后(1:沒有;0:有)*/
//顯示輸入填寫的數字
void ArrangeQueen()
{
int i;
char answer;
printf("輸入棋盤邊格數:");
scanf("%d",&n);
for(i=0;i<=n;i++) /*設定程式初始狀態*/
ColFlag[i] = 1;
for(i=0;i<=2*n;i++)
upBiasFlag[i] = dnBiasFlag[i] = 1;
m = 1;
ColFlag[1] = 1;
NotCatch = 1;
ColFlag[0] = 0;
do
{
if(NotCatch)
{
if(m==n)
{
printf("列 行");
for(i=1;i<=n;i++) /*找到可行解,輸出*/
printf("%3d %3d ",i,ColFlag[i]);
printf("還要繼續搜尋嗎(Q/q for Exit)? ");
scanf("%c",&answer);
if(answer=='Q' || answer=='q')
exit(0);
while(ColFlag[m] == n)
{
m--; /*清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的標誌*/
RowFlag[ColFlag[m]] = upBiasFlag[m+ColFlag[m]] = dnBiasFlag[n+m-ColFlag[m]] = 1;
}
ColFlag[m]++; /*調整第m列的皇后配置(擴充套件調整)*/
}
else
{
/*設定第m列,第RowFlag[ColFlag[m-1]]行有皇后的標誌*/
RowFlag[ColFlag[m]] = upBiasFlag[m+ColFlag[m]] = dnBiasFlag[n+m-ColFlag[m]] = 0;
ColFlag[++m] = 1; /*向前試探*/
}
}
else
{
while(ColFlag[m]==n) /*向後回溯*/
{
m--; /*清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的標誌*/
RowFlag[ColFlag[m]] = upBiasFlag[m+ColFlag[m]] = dnBiasFlag[n+m-ColFlag[m]] = 1;
}
ColFlag[m]++; /*調整第m列的皇后配置(回溯調整)*/
}
NotCatch = RowFlag[ColFlag[m]] && upBiasFlag[m+ColFlag[m]] && dnBiasFlag[n+m-ColFlag[m]];
}while(m!=0);
}
void dArrange_Queen_All(int k,int n)
{
int i,j;
char answer;
for(i=1;i<=n;i++)
{
if(RowFlag[i] && upBiasFlag[k+i] && dnBiasFlag[n+k-i])
{
ColFlag[k] = i;
RowFlag[i] = upBiasFlag[k+i] = dnBiasFlag[n+k-i] = 0;
if(k==0)
{
printf("列 行");
for(j=1;j<=n;j++) /*找到可行解,輸出*/
printf("%3d %3d ",i,ColFlag[i]);
printf("還要繼續搜尋嗎(Q/q for Exit)? ");
scanf("%c",&answer);
if(answer=='Q' || answer=='q')
exit(0);
}
else
dArrange_Queen_All(k+1,n);
RowFlag[i] = upBiasFlag[k+i] = dnBiasFlag[n+k-i] = 1;
}
}
}
void dArrangeQueenAll()
{
int i;
printf("輸入棋盤邊格數:");
scanf("%d",&n);
for(i=0;i<=n;i++) /*設定程式初始狀態*/
ColFlag[i] = 1;
for(i=0;i<=2*n;i++)
upBiasFlag[i] = dnBiasFlag[i] = 1;
dArrange_Queen_All(1,n);
}
//國際象棋“皇后”問題的回溯演算法
/*
作者:成曉旭
時間:2001年10月9日(17:35:38-18:00:00)
內容:完成“皇后”問題的程式序言部分
時間:2001年10月9日(14:00:00-15:00:00)
內容:完成“皇后”問題的程式序言部分
===================================================
問題描述:
在一個n*n的棋盤上放置n個不能互相捕捉的國際象棋“皇后”,
並輸出所有合理的佈局情況.(在國際象棋中,皇后可以沿著縱、橫
及兩條斜線共4個方向捕捉對手,可見,合適的解是在每行、每列及
在一條斜線上只能有一個皇后<皇后相互捕捉>)
程式設計思想:
演算法描述:
{
輸入棋盤大小值n;
m=0; //從空配置開始
notcatch=1; //空配置中皇后不能相互捕捉
do
{
if(notcatch)
{
if(m==n)
{
輸出解;
調整(形成下一個候選解);
}
else
擴充套件當前候選解至下一列; //向前試探
}
else
調整(形成下一個候選解); //向後回溯
notcatch = 檢查當前候選解的合理性
}while(m!=0)
}
*/
#include "stdlib.h"
#define MAXN 100
//全域性變數及全域性工作陣列定義
int m,n,NotCatch;
int ColFlag[MAXN+1]; /*表示第i列的第ColFlag[i]行有皇后,(1:有;0:沒有)*/
int RowFlag[MAXN+1]; /*RowFlag[i]:表示第i行沒有皇后(1:沒有;0:有)*/
int upBiasFlag[2*MAXN+1]; /*upBiasFlag[i]:表示第i條上斜線(右高左斜)沒有皇后(1:沒有;0:有)*/
int dnBiasFlag[2*MAXN+1]; /*dnBiasFlag[i]:表示第i條下斜線(左高右斜)沒有皇后(1:沒有;0:有)*/
//顯示輸入填寫的數字
void ArrangeQueen()
{
int i;
char answer;
printf("輸入棋盤邊格數:");
scanf("%d",&n);
for(i=0;i<=n;i++) /*設定程式初始狀態*/
ColFlag[i] = 1;
for(i=0;i<=2*n;i++)
upBiasFlag[i] = dnBiasFlag[i] = 1;
m = 1;
ColFlag[1] = 1;
NotCatch = 1;
ColFlag[0] = 0;
do
{
if(NotCatch)
{
if(m==n)
{
printf("列 行");
for(i=1;i<=n;i++) /*找到可行解,輸出*/
printf("%3d %3d ",i,ColFlag[i]);
printf("還要繼續搜尋嗎(Q/q for Exit)? ");
scanf("%c",&answer);
if(answer=='Q' || answer=='q')
exit(0);
while(ColFlag[m] == n)
{
m--; /*清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的標誌*/
RowFlag[ColFlag[m]] = upBiasFlag[m+ColFlag[m]] = dnBiasFlag[n+m-ColFlag[m]] = 1;
}
ColFlag[m]++; /*調整第m列的皇后配置(擴充套件調整)*/
}
else
{
/*設定第m列,第RowFlag[ColFlag[m-1]]行有皇后的標誌*/
RowFlag[ColFlag[m]] = upBiasFlag[m+ColFlag[m]] = dnBiasFlag[n+m-ColFlag[m]] = 0;
ColFlag[++m] = 1; /*向前試探*/
}
}
else
{
while(ColFlag[m]==n) /*向後回溯*/
{
m--; /*清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的標誌*/
RowFlag[ColFlag[m]] = upBiasFlag[m+ColFlag[m]] = dnBiasFlag[n+m-ColFlag[m]] = 1;
}
ColFlag[m]++; /*調整第m列的皇后配置(回溯調整)*/
}
NotCatch = RowFlag[ColFlag[m]] && upBiasFlag[m+ColFlag[m]] && dnBiasFlag[n+m-ColFlag[m]];
}while(m!=0);
}
void dArrange_Queen_All(int k,int n)
{
int i,j;
char answer;
for(i=1;i<=n;i++)
{
if(RowFlag[i] && upBiasFlag[k+i] && dnBiasFlag[n+k-i])
{
ColFlag[k] = i;
RowFlag[i] = upBiasFlag[k+i] = dnBiasFlag[n+k-i] = 0;
if(k==0)
{
printf("列 行");
for(j=1;j<=n;j++) /*找到可行解,輸出*/
printf("%3d %3d ",i,ColFlag[i]);
printf("還要繼續搜尋嗎(Q/q for Exit)? ");
scanf("%c",&answer);
if(answer=='Q' || answer=='q')
exit(0);
}
else
dArrange_Queen_All(k+1,n);
RowFlag[i] = upBiasFlag[k+i] = dnBiasFlag[n+k-i] = 1;
}
}
}
void dArrangeQueenAll()
{
int i;
printf("輸入棋盤邊格數:");
scanf("%d",&n);
for(i=0;i<=n;i++) /*設定程式初始狀態*/
ColFlag[i] = 1;
for(i=0;i<=2*n;i++)
upBiasFlag[i] = dnBiasFlag[i] = 1;
dArrange_Queen_All(1,n);
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=935666
相關文章
- 從八皇后問題到回溯演算法演算法
- 使用回溯演算法解決N皇后問題以及間隔排列問題演算法
- 資料結構和演算法——遞迴-八皇后問題(回溯演算法)資料結構演算法遞迴
- 回溯法(排列樹)解決八(N)皇后問題
- 回溯演算法 | 追憶那些年曾難倒我們的八皇后問題演算法
- 用棧+回溯+非遞迴解決N皇后問題遞迴
- 【演算法】8皇后問題演算法
- js使用遞迴回溯法解八皇后問題程式碼分享JS遞迴
- C#資料結構與演算法系列(十四):遞迴——八皇后問題(回溯演算法)C#資料結構演算法遞迴
- 每天刷個演算法題20160519:回溯法解八皇后演算法
- 質數填表問題的回溯演算法演算法
- 演算法學習回顧-皇后問題演算法
- 《演算法》系列—大白話聊分治、回溯,手撕八皇后演算法
- N皇后問題
- 八皇后之回溯法解決
- turtle繪製國際象棋棋盤
- 最小國際象棋程式背後的恩怨情仇
- 回溯問題
- 【演算法習作】中國象棋將帥問題演算法
- 每日一題之拉低通過率 回溯演算法 leetcode 51 N皇后每日一題演算法LeetCode
- 【經典演算法問題】馬的遍歷【回溯】演算法
- 洛谷八皇后問題
- 轉:八皇后問題 java實現,演算法兩則Java演算法
- 【LeetCode回溯演算法#08】遞增子序列,鞏固回溯演算法中的去重問題LeetCode演算法
- 【LeetCode回溯演算法#07】子集問題I+II,鞏固解題模板並詳解回溯演算法中的去重問題LeetCode演算法
- Leetcode 通過率最高的困難題 N皇后 II 【回溯解法-剪枝】LeetCode
- Java的國際化問題 (轉)Java
- leetcode演算法題解(Java版)-9-N皇后問題LeetCode演算法Java
- 八皇后問題python解法Python
- 八皇后問題自我總結
- Luogu P5005 中國象棋 - 擺上馬 / Luogu P8756 國際象棋 題解 [ 藍 ] [ 狀壓 dp ] [ 位運算 ]
- c++迷宮問題回溯法遞迴演算法C++遞迴演算法
- 三路國際象棋:非常有創意的棋類遊戲遊戲
- 用 Python 編寫一個國際象棋 AI 程式PythonAI
- 八皇后問題分析和實現
- N皇后問題(各種優化)優化
- 刷題總結——回溯演算法演算法
- leetcode.回溯演算法能解決什麼問題?LeetCode演算法