當前位置:首頁 » 編程語言 » c語言四皇後

c語言四皇後

發布時間: 2022-02-16 17:22:17

『壹』 c語言 n皇後 求高手

八皇後問題各種語言版本:
http://ke..com/view/698719.htm
#include<iostream.h>

const int n = 15 ; //15皇後問題.改動n可變成N皇後問題
const int n_sub = n - 1 ;
int queen[n] ; //N個棋子.N對應每一列,如n=0的棋子只下在0列,1下1....類推
bool row[n] ; //棋局的每一行是否有棋,有則為1,無為0 ;
bool passive[2*n-1] ; //斜率為1的斜線方向上是不是有皇後
bool negative[2*n-1] ; //斜率為負1的斜線方向上是不是有皇後.
//之所以用全局變數,因全局數組元素值自動為0

int main()
{
int cur = 0 ;//游標,當前移動的棋子(哪一列的棋子)
bool flag = false ; //當前棋子位置是否合法
queen[0] = -1 ; //第0列棋子准備,因一開始移動的就是第0列棋子
int count = 0 ; //一共有多少種下法 ;
cout<<"============================Starting============================="<<endl ;

while(cur>=0)
{
while(cur>=0 && queen[cur]<n && !flag) //當還不確定當前位置是否可下
{
queen[cur]++ ;
// cout<<"第"<<cur<<"列棋子開始走在第"<<queen[cur]<<"行"<<endl ;
// cin.get() ;
if(queen[cur] >= n) { //如果當前列已經下完(找不到合法位置)
// cout<<"當前行是非法行,當前列棋子走完,沒有合法位置,回溯上一列棋子"<<endl ;
// cin.get() ;
queen[cur] = -1 ; //當前列棋子置於准備狀態
cur-- ; //回溯到上一列的棋子
if(cur>=0) {
row[queen[cur]] = false ;
passive[queen[cur] + cur] = false ;
negative[n_sub + cur - queen[cur]] = false ;
}
//由於要移下一步,所以回溯棋子原位置所在行應該沒有棋子啦.置row[]為false
//並且棋子對應的斜線的標志位passive[cur]和negative[cur]也應該要設為false ;
}
else {
//先判斷棋子所在行沒有棋子
if(row[queen[cur]] == false) { //當前行沒有棋子
// cout<<"棋子"<<cur<<"所在行沒有其他棋子,正在檢查斜線"<<endl ;
flag = true ; // 暫設為true,或與之前棋子斜交,則再設為false ;
//以下檢查當前棋子是否與之前的棋子斜線相交
if( passive[queen[cur] + cur] == true || negative[n_sub + cur - queen[cur]] == true) {
flag = false ;
// cout<<"出現斜線相交,該位置不合法"<<endl ;
}
else
flag = true ;
if(flag) { //沒有斜交,位置合法
// cout<<"斜線也沒有相交,該位置合法"<<endl ;
if(cur == n-1) //如果是最後一個棋子
{
// cout<<"棋子走完一輪,總走法加1"<<endl ;
count++ ; //總走法加一 ;
}
row[queen[cur]] = true ;// 當前行設為有棋子
passive[queen[cur] + cur] = true ;//當前行正斜率方向有棋子
negative[n_sub + cur - queen[cur]] = true ; //當前行負斜率方向上也有棋子
cur++ ;
if(cur >= n) {
cur-- ;
row[queen[cur]] = false ;
passive[queen[cur] + cur] = false ;
negative[n_sub + cur - queen[cur]] = false ;//原理同回溯
}
flag = false ;
}
}
}//else
}
}
cout<<n<<"皇後問題一共有"<<count<<"種解法"<<endl ;
return 0 ;
}
你自己修改一下吧。

『貳』 幫忙用C語言編寫程序「四皇後問題」

額。。搜一個八皇後的問題,把數組范圍變成4*4,把判斷條件改一下就可以了

『叄』 C語言中關於4皇後或8皇後問題!

用棧,以及回溯法來做
#include<stdio.h>
#include<math.h>

int place(int b);
int a[10]; //定義棧來記錄皇後位置

int main(void)
{
int n; //輸入
int k; //第k個皇後
int j; //輸出結果用
scanf("%d",&n);
a[1]=0;
k=1; //第一個皇後開始

while(k>0)
{
a[k]=a[k]+1; //第一次是從1開始,以後是退回前一個皇後時這個皇後的位置向後挪一位

while(a[k]<=n&&!place(k)) // 位置合法?
a[k]=a[k]+1; //不合法再向後挪一位
if(a[k]<=n) //位置沒有超過合法位置
{
if(k==n) //全部皇後安放完
{
for(j=1;j<=n;j++)// 輸出位置
printf("%3d",a[j]);
printf("\n");
}
else //還有皇後沒有放
{
k++; //繼續放下一個皇後
a[k]=0; //初始化位置
}
}
else //位置不合法
k--; //退回去,回溯
}

return 0;

『肆』 C語言編程,用回溯法解四皇後問題

http://wenku..com/view/0ab2ec8984868762caaed5c8.html

『伍』 C語言四皇後問題

那一步的意思是將之前的位置清零。
Q[i][j] = 1; // 先在 i、j 的位置上放皇後
Queen(j+1,Q); // 遞歸調用判斷下一行的位置是否符合要求
Q[i][j] =0; // 位置i、j判斷完了之後要清零,以便下一次判斷。

就好像是這樣的,比如第一行第三列你放了一個皇後:0 0 1 0
然後跟著判斷下一行怎麼放,再下一行怎麼放 。。。一直遞歸下去。
把所有的情況都遞歸遍歷完成後,再回到第一行,再在第四列放皇後,0 0 0 1。
然後再重復之前的判斷,但是你在程序中,之前的第三列已經放了皇後的,所以在第四列放皇後之前,第三列的那個皇後要清掉。

『陸』 用C語言編寫八皇後問題

#include "stdio.h"
#include "windows.h"
#define N 8 /* 定義棋盤大小 */
int place(int k); /* 確定某一位置皇後放置與否,放置則返回1,反之返回0 */
void backtrack(int i);/* 主遞歸函數,搜索解空間中第i層子樹 */
void chessboard(); /* 每找到一個解,列印當前棋盤狀態 */
static int sum, /* 當前已找到解的個數 */
x[N]; /* 記錄皇後的位置,x[i]表示皇後i放在棋盤的第i行的第x[i]列 */
int main(void)
{
backtrack(0);
system("pause");
return 0;
}
int place(int k)
{
/* 測試皇後k在第k行第x[k]列時是否與前面已放置好的皇後相攻擊。 x[j] == */
/* x[k] 時,兩皇後在同一列上;abs(k - j) == abs(x[j] - x[k]) 時,兩皇 */
/* 後在同一斜線上。兩種情況兩皇後都可相互攻擊,故返回0表示不符合條件。*/
for (int j = 0; j < k; j ++)
if (abs(k - j) == abs(x[j] - x[k]) || (x[j] == x[k])) return 0;
return 1;
}
void backtrack(int t)
{
/* t == N 時,演算法搜索至葉結點,得到一個新的N皇後互不攻擊的放置方案 */
if (t == N) chessboard();
else
for (int i = 0; i < N; i ++) {
x[t] = i;
if (place(t)) backtrack(t + 1);
}
}
void chessboard()
{
printf("第%d種解法:\n", ++ sum);
for (int i = 0; i < N; i ++) {
for (int j = 0; j < N; j ++)
if (j == x[i]) printf("@ ");
else printf("* ");
printf("\n");
}
printf("\n");
}

『柒』 請教,做二個C語言程序,一個是日歷程序,一個是經典八皇後問題的變形--四皇後程序。

來我空間給你八皇後程序

『捌』 C語言,八皇後最簡單的寫法

/*八皇後問題是在8X8格的國際象棋上擺放八個皇後,使其不能互相攻擊,即
任意兩個皇後都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

1.我們需要一個數據存放已經放置皇後的位置,用指針表示的一維數據*position,長度為N(N為放置的皇後總數),
因為該問題是每行,每列,每組對角線只可能出現一個皇後,
所以用一維數據position+i中的i則能代碼第幾行,而值*(position+i)則表示該行中的列值.

2.判斷每行可放置皇後,假設要判斷第n行,則從position中從0到n-1每一個已放皇後的位置判斷(列,對角線)*/

#include <iostream>
#include <math.h>
#include <malloc.h>
#include <windows.h>

using namespace std;

int *position; //放置的位置
int queen; //皇後數目
int count; //第N種可能性

//判斷第n行是否放置皇後
bool SignPoint(int n)
{
for (int i=0;i<n;i++)
{
if (*(position+i) == *(position+n)) //該列已經放置過皇後了
return false;
if (abs(*(position+i) - *(position+n)) == n-i) //對角線已經放置過了
return false;
}
return true;
}

//設置皇後
void SetQueen(int n=0)
{
if (queen==n)
{

printf("NO.%d: ",++count);
printf("\n");
for (int i=0;i<queen;i++)
{
for (int j=0;j<queen;j++)
{
if (j == position[i])
{
printf("* ");Sleep(1500);
}
else
{
printf("0 ");
}
}
printf("\n");
}
printf("\n");
return;

}
else
{
for (int i=0;i<queen;i++)
{
position[n] = i;

if(SignPoint(n))//如果該位置放置皇後正確的話,則到下一行
{
SetQueen(n+1);
}
}
}
}

int main(int argc,char argv[])
{
cout<<"請輸入皇後的總數:"<<endl;
cin>>queen;
position = (int*)malloc(sizeof(int));
SetQueen();
cout<<"擺放完畢"<<endl;
cin.get();
cin.get();
return 0;
}

『玖』 皇後問題用C語言表示

#include<stdio.h>
#include<math.h>
#define N 12
int ans[N],sum;
int check(int x)//驗證可否放置
{
int i;
for(i = 0;i < x;i ++)
if( fabs(x-i) == fabs(ans[x]-ans[i]) || ans[x]==ans[i])
return 0;
return 1;
}
void DFS(int t)
{
int i,j;
if(t == N)
{
printf("第%d組解 \n",++sum);
for(i = 0;i < N ; i ++)
{
for(j = 0;j < N ; j ++)
{
if(j == ans[i]) printf("0 ");
else printf("1 ");
}
printf("\n");
}
printf("\n");
}
for(i = 0;i < N ;i ++)//搜索范圍
{
ans[t] = i;
if(check(t)) DFS(t+1);
}
return ;
}
int main()
{
sum = 0;
DFS(0);
return 0;
}

熱點內容
伺服器ip顯示泛播 發布:2025-01-09 10:10:34 瀏覽:711
緩存火影圖片 發布:2025-01-09 10:05:00 瀏覽:645
設置消費密碼驗證的渠道是什麼 發布:2025-01-09 09:59:21 瀏覽:869
小米9域名伺服器地址 發布:2025-01-09 09:59:14 瀏覽:607
各類資料庫 發布:2025-01-09 09:58:30 瀏覽:254
php判斷進制 發布:2025-01-09 09:54:44 瀏覽:282
何謂編程結構 發布:2025-01-09 09:54:09 瀏覽:381
python期末 發布:2025-01-09 09:54:01 瀏覽:709
方舟和輻射4哪個要求配置高 發布:2025-01-09 09:48:14 瀏覽:876
如何遊玩我的世界外國伺服器 發布:2025-01-09 09:21:27 瀏覽:470