當前位置:首頁 » 編程語言 » n皇後問題c語言代碼
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

n皇後問題c語言代碼

發布時間: 2023-04-03 23:23:33

1. c語言n皇後問題

if(i==n-1)執行到了,但是 i 取值有問題,j=0的時候i就增加到5,j>0之後if(i==n-1)就不可能成立了

2. N皇後問題c語言代碼不知道哪裡有問題,求高手啊!

//以下是我手頭有的AC程序
#include<stdio.h>
#include<math.h>
int place(int k,int *X)//檢查可宏殲不蔽兄沖可以放置一個新的皇後
{
int i=1;
while(i<k){
if((X[i]==X[k])||(abs(X[i]-X[k])==abs(i-k)))return 0;
i++;
}
return 1;
}
void Nqueens(int n,int *X)
{
int k=1,i;X[1]=0;
while(k>0){
X[k]=X[k]+1;
while((X[k]<=n)&&(!place(k,X)))X[k]++;
if(X[k]<=n)if(k==n){
for(i=1;i<塵笑=n;i++)printf("%-6d",X[i]);
printf("\n");
}
else {k++;X[k]=0;}
else k=k-1;
}
}
int main()
{
int n;
int i;
printf("請輸入皇後的個數:");
scanf("%d",&n);
int X[20];
Nqueens(n,X);
}

3. c語言 N皇後問題

q[j] == i表示與上個棋子同列(同行是不可能,不用考慮),還有情況得舍棄的就是斜線蔽埋,左斜和右斜,)(abs(q[j]-i)==(abs(j-k))))這個就表示與前面的棋子是否在同型唯一斜線,左斜右斜都包括了,你自己寫寫就能總結出這卜並培個式子了,數學計算而已。不懂HI我

4. 如何用C語言編寫八皇後問題

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

5. 如何用C語言解決N皇後問題並作出流程圖

#include"iostream"

using namespace std;

const max_board = 13;

class Queen
{
public :
Queen(int size);
bool is_solved() const; //判斷是否已經填滿
void print() const; //列印結果
bool unguarded(int col) const; //判斷是否被鎖定
void insert(int col); //在該位放置皇後
void remove(int col); //移除皇後
// void solve_from(Queen &configuration);
int board_size; //邊界
private :
int count; //已放置皇後的數目
bool queen_square[max_board][max_board]; //棋盤
};
Queen::Queen(int size)
{
if(size<1)
board_size=1;
else
if(size>13)
board_size=13;
else
board_size=size;
count=0;
for(int i=0;i<board_size;i++)
for(int j=0;j<board_size;j++)
{
queen_square[i][j]=false;
}
}
bool Queen::is_solved() const
{
return count==board_size;
}
void Queen::print() const
{
for(int i=0;i<board_size;i++)
{
for(int j=0;j<board_size;j++)
{
cout<<queen_square[i][j]<<' ';
}
cout<<endl;
}
cout<<endl;
}
bool Queen::unguarded(int col) const
{
int i;
bool ok=true;
for(i=0;ok&&i<count;i++)
{
ok=!queen_square[i][col];
}
for(i=1;i<=col&&i<=count&&ok;i++)
{
ok=!queen_square[count-i][col-i];
}
for(i=1;i<board_size-col&&i<=count&&ok;i++)
{
ok=!queen_square[count-i][col+i];
}

return ok;
}
void Queen::insert(int col)
{
queen_square[count++][col]=true;
}
void Queen::remove(int col)
{
queen_square[--count][col]=false;
}
void solve_from(Queen &configuration)
{
if(configuration.is_solved())
configuration.print();
else
for(int col=0;col<configuration.board_size;col++)
if(configuration.unguarded(col))
{
configuration.insert(col);
solve_from(configuration);
configuration.remove(col);
}
}
int main()
{
int n;
cout<<"please input the size:\t";
cin>>n;
Queen queen(n);
solve_from(queen);
return 0;
}

6. 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 ;
}
你自己修改一下吧。

7. 怎麼運用最佳優先搜索求解N皇後問題 用c語言實現 求代碼

#include <iostream>
#include <cmath>
using namespace std;
int w=1;
const int n=8;
void fun(int a[],int n,int t) //滴t行的皇後位子
{
int p;
for (int i=1;i<=n;i++)
{
p=1;
a[t]=i; //皇後在 t 行 i 列
for (int j=1;j<t;j++)
{
if (a[t]==a[j]||(fabs(a[t]-a[j])==fabs(t-j))) //洞罩拍不滿足皇後的要求
{
p=0;
break;
}
}
if(p==1) //滿悶伍足皇後的要求
{
if (t==n)
{
cout<<納羨"\n8皇後的第"<<w<<"解:";
for (int k=1;k<=n;k++)
{
cout<<"("<<k<<","<<a[k]<<")";
}
w++;
}
else
fun(a,n,t+1);
}
}
}
void main()
{
int t=1;
int a[n];
fun(a,n,t);
if (w==1)
cout<<"無解!\n";
}

8. N皇後回溯問題 解釋下這程序 C語言

#include <stdio.h>

#define DelayTime 20000
#define TopX 10
#define TopY 5

int N;/*此處開始設置幾個全局變數 N即代表皇後個數*/
int a[8], b[15], c[15];
int Num = 0;/*Num代表解決方法個數*/
int row;
/******************************************************************************/
void BackTrack (int row)
{
int col;
for (col=1; col<=N; col++)
{
if (a[col-1] + b[row+col-2] + c[row-col+N-1] == 0) /*1,為什麼這里要等於0? if語句里的3個表達式都代表什麼呢?*/
{
a[col-1] = 1;
b[row+col-2] = 1;
c[row-col+N-1] = 1;
gotoxy(col*2 + TopX, row + TopY); /* 2,這里的gotoxy()語句是做什麼的? 僅僅是跳到相應位置,列印Q*/
putch('Q');

if (row < N)
{
BackTrack (row + 1); /* 3,這句什麼意思? 遞歸調用*/
}
else
{
Num++;
gotoxy(40, 9); /* 4,這里又是做什麼的?什麼用?*/
printf("Num: %d ", Num);
delay(DelayTime); /* 5,這里又有什麼用?延遲*/
}

a[col-1] = 0;
b[row+col-2] = 0; /* 6,這個三個表達式怎麼又成0了?*/
c[row-col+N-1] = 0;
gotoxy(col*2 + TopX, row + TopY); /* 7,這又是什麼用?*/
putch('.');

}
}
}
/********************************************************************************/
void main()
{
int i, j;
clrscr();

gotoxy(1, 10);
printf("Input the number of queen: ");
while(N <= 0 || N > 100)
{
scanf("%d", &N);
if(N > 100) printf("Two huge number, input again:");
if(N <= 0) printf("Can's smaller than 1, again:");
}

clrscr();

for(i=1; i<=N; i++)
{
for(j=1; j<=N; j++)
{
gotoxy(i*2 + TopX, j + TopY); /* 8,這里又是什麼用? 將游標移動到指定位置說明:gotoxy(x,y)將游標移動到指定行y和列x。
*/
putch('.');
}
}

BackTrack(1); /* 9,為什麼是1呢?不是應該傳遞的是皇後的數量嗎?第一行,N為皇後的數量*/

gotoxy(12, 17); /* 10,這又是什麼用?*/
printf ("There are %d kinds of solution.\n", Num);

getch();
}

9. N皇後問題(C語言,5<n<14)

N, n 是拉丁字母中的第14個字母。

閃族語中的Nûn可能是表示「蛇」的圖形,它的音值是/n/,這與希臘語、伊特魯里亞語、拉丁語和所有當代語言的發音是一樣的。希臘名稱是:Nυ,Ny。

字母N的含意

大寫N代表

在化學中,表示元素氮的化學符號

牛頓,物理學力的單位
數學中,代表自然數集

小寫n代表

在代數學中,常用作為整數值的變數

音標

國際音標

[n]是齒齦鼻音

[..]是小舌鼻音

漢語拼音

「n」是舌尖前鼻音 (齒齦鼻音)

字元編碼

字元編碼 ASCII Unicode EBCDIC

大寫 N 78 004E 213

小寫 n 110 006E 149

參看

修飾自N的字母

ǹ — Ńń — Ňň — Ņņ

其他字母中的相近字母

..(希臘字母 Nu)

..(西里爾字母 En)
詞性
n表示名詞

元素符號: N 英文名: Nitrogen 中文名: 氮

相對原子質量: 14.0067 常見化合價: -3,+1,+2,+3,+4,+5 電負性: 3.04
外圍電子排布: 2s2 2p3 核外電子排布: 2,5
同位素及放射線: N-13[9.97m] *N-14 N-15 N-16[7.13s]

電子親合和能: -20 KJ·mol-1
第一電離能: 1402.3 KJ·mol-1 第二電離能: 2856.1 KJ·mol-1 第三電離能: 4578.1 KJ·mol-1
單質密度: 0.0012506 g/cm3 單質熔點: -209.9 ℃ 單質沸點: -195.8 ℃
原子半徑: 0.75 埃 離子半徑: 1.71(-3) 埃 共價半徑: 0.75 埃
常見化合物: NH3 各種銨鹽 N2O NO NO2 N2O3 N2O4 N2O5 HNO3 Li3N Mg3N2 AlN AgNO3

發現人: D.盧瑟福 時間: 1772 地點: 蘇穗芹格蘭

名稱由來:
希臘文:nitron和genes(由蘇打形成)。
元素描述:
無色無臭無味的不活潑氣體。在宇宙中含量第五,形成了地球大氣層的78%。
元素來源:
通過分餾液態空氣得到。
元素用途:
主要用碼缺於製造氨氣和其他化肥,也用來製造能應用於炸葯的硝酸。氮氣在焊接和石油精煉中也大有用武之地。

N,《DEATH NOTE》中的NEAR(尼亞) ,真名NATE RIVERNEAR,最接近L的天才少年,對付基拉的組織SPK的核心人物.

N在中文及現代漢語中的應用:
通常會聽到有人說「我做了N遍」什麼事情,在這里N代表了很多的意思,來源於高等數學中的微積分
在微積分中常用N來作為變數,如"N趨向於無窮","N趨近於0",等等
這個詞的流行是在網路開始盛行的2001左右,應該出自於當時的大一大二學生中
我們常說N個實際上省略了後面一句N趨向於無窮,以誇張其數量的多,也有人說"N+1個",是同樣的道理

如果您認為本詞條還有待完善,需要補充新內容或修改錯誤內容,請遲族辯 編輯詞條
參考資料:
1.《Death Note》

貢獻者(共10名):
66225741、Freedom灬、VincentAi、山櫻詩社、aaa6032、xxyunxiangxx、deanan、憑欄看劍、gxlzj、江安才子
本詞條在以下詞條中被提及:
L月、低氧化物、水花、J、尼亞、泥母、銀河宇宙線、血凝素、來母、硫氮化物、齒齦鼻音、舌尖齒齦鼻輔音、整數、N字旗
「n」在英漢詞典中的解釋(來源:網路詞典):

N
KK: []
DJ: []
n.
1. 英語字母中的第十四個字母,小寫為n

n
KK: []
DJ: []
n.
你該了解下

10. 利用《數據結構》課程知識完成C語言程序設計「N皇後問題」(堆棧,一維數組,普通演算法都可以,用C語言寫

#include<stdio.h>//N皇後問題

#include<
stdlib.h
>

#include<stdio.h>


#include<
iostream.h
>


#include<
time.h
>

#include<dos.h>

#include<malloc.h>

typedefstruct{

int*elem;

intlength;

intlistsize;

}Sqlist;

intInitList(Sqlist&L){//初始化

L.elem=(int*)malloc(100*sizeof(int));

if(!L.elem)

return0;

L.length=0;

L.listsize=100;

return1;

}


intInsert(Sqlist&L,inte){//插入

intm=0,i=0;

int*p=&L.elem[0],*j=&L.elem[0];

if(L.length==0)

{*p=e;L.length++;return1;}

for(i;i<L.length;i++)

if(e>=*(p+i))

m=i+1;

for(i=L.length;i>m;i--)

*(j+i)=*(j+i-1);

L.elem[m]=e;

L.length++;

return1;

}


voidPrint(Sqlist&L,intn){//
遍歷
列印輸出

intk=1,i=0;int*p=&L.elem[0];

for(i=0;i<n*n;i++,k++){

printf("%d",*(p+i));

if(k==n){k=0;printf(" ");}}

printf(" ");

}


intReturnK(Sqlist&L,intk){//返回第K個元素的值

int*p=&L.elem[0];

return*(p+k-1);咐仿

}


voidFuK(Sqlist&L,intk,inte){//將第k個元素賦值為e

int*p=&L.elem[0];

*(p+k-1)=e;

}


intTiaoJian(SqlistL,intn,int&e){//是否滿足皇後問題判斷

intb[100];

intm=0,h=2*n;

for(intk=0;k<2*n;k++)b[k]=0;

for(inti=1;i<=n*n;i++)

if(ReturnK(L,i)==1)

{b[m]=(i-1)/n+1;m++;b[m]=i-(b[m-1]-1)*n;m++;}

for(intc=0;c<2*n;c++)

if(b[c]==0){h=c;break;}

for(c=0;c<h-2;c=c+2)

for(intd=c+2;d<h;d=d+2)

if(b[c]==b[d]||b[c+1]==b[d+1]||b[d+1]-b[c+1]==b[d]-b[c]||b[d+1]-b[c+1]==b[c]-b[d])

return0;

if(h==2*n){

printf(" %d皇後問題第%d個排列衡告纖! ",n,e);e++;

}

return1;

}

voidTrial(Sqlist&L,inti,intn,int&e){//皇後問題

intj;

if(i>n){Print(L,n);}

elsefor(j=1;j<=n;j++){

FuK(L,n*i-n+j,1);

if(TiaoJian(L,n,e)==1)

Trial(L,i+1,n,e);

FuK(L,n*i-n+j,0);

}

}

voidmain(){

intk,i=0;

printf(" 請輸入要n皇後問題個數: ");

scanf("%d",&k);

time_trawtime;

structtm
*timeinfo;

time(友飢&rawtime);

timeinfo=localtime(&rawtime);


SqlistL1;

InitList(L1);

for(i=0;i<k*k;i++)

Insert(L1,0);

inte=1;

Trial(L1,1,k,e);

printf("Thecurrentdate/timeis:%s",asctime(timeinfo));

time(&rawtime);

timeinfo=localtime(&rawtime);

printf("Thecurrentdate/timeis:%s",asctime(timeinfo));


printf("哈哈哈哈(^o^)/~ ");

system("pause");


}