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

八皇後回溯演算法代碼c語言

發布時間: 2022-05-20 12:02:41

c語言八皇後

這是經典題目,答案網上有的是,抄一個學學就可以了:
回溯法進行求解,程序實現如下:
#include<stdio.h>
#define Queens 8 //定義結果數組的大小,也就是皇後的數目
int a[Queens+1]; //八皇後問題的皇後所在的行列位置,從1開始算起,所以加1
int main(){
int i, k, flag, not_finish=1, count=0;
//正在處理的元素下標,表示前i-1個元素已符合要求,正在處理第i個元素
i=1;
a[1]=1; //為數組的第一個元素賦初值
printf("The possible configuration of 8 queens are:\n");
while(not_finish){ //not_finish=l:處理尚未結束
while(not_finish && i<=Queens){ //處理尚未結束且還沒處理到第Queens個元素
for(flag=1,k=1; flag && k<i; k++) //判斷是否有多個皇後在同一行
if(a[k]==a[i])
flag=0;
for (k=1; flag&&k<i; k++) //判斷是否有多個皇後在同一對角線
if( (a[i]==a[k]-(k-i)) || (a[i]==a[k]+(k-i)) )
flag=0;
if(!flag){ //若存在矛盾不滿足要求,需要重新設置第i個元素
if(a[i]==a[i-1]){ //若a[i]的值已經經過一圈追上a[i-1]的值
i--; //退回一步,重新試探處理前一個元素
if(i>1 && a[i]==Queens)
a[i]=1; //當a[i]為Queens時將a[i]的值置1
else
if(i==1 && a[i]==Queens)
not_finish=0; //當第一位的值達到Queens時結束
else
a[i]++; //將a[il的值取下一個值
}else if(a[i] == Queens)
a[i]=1;
else
a[i]++; //將a[i]的值取下一個值
}else if(++i<=Queens)
if(a[i-1] == Queens )
a[i]=1; //若前一個元素的值為Queens則a[i]=l
else
a[i] = a[i-1]+1; //否則元素的值為前一個元素的下一個值
}
if(not_finish){
++count;
printf((count-1)%3 ? "\t[%2d]:" : "\n[%2d]:", count);
for(k=1; k<=Queens; k++) //輸出結果
printf(" %d", a[k]);
if(a[Queens-1]<Queens )
a[Queens-1]++; //修改倒數第二位的值
else
a[Queens-1]=1;
i=Queens -1; //開始尋找下一個滿足條件的解
}
}

② 編寫程序對八皇後問題進行求解(用C++):編寫程序對八皇後問題進行求解: 在8行8列的棋盤上放置8個皇後,

這是一個古老的具有代表性的問題,用計算機求解時的演算法也很多,這里僅介紹一種。
採用一維數組來進行處理。數組的下標i表示棋盤上的第i列,a[i]的值表示皇後在第i列所放的位置。如:a[1]=5,表示在棋盤的第一例的第五行放一個皇後。
程序中首先假定a[1]=1,表示第一個皇後放在棋盤的第一列的第一行的位置上,然後試探第二列中皇後可能的位置,找到合適的位置後,再處理後續的各列,這樣通過各列的反復試探,可以最終找出皇後的全部擺放方法。
程序採用回溯法,演算法的細節參看程序。
//網上找的,我自己在vc上編寫了一遍,自己設斷點,一步步看它的運行過程,很經典,易懂
#include<iostream.h>
#define NUM 8/*定義數組的大小*/
int a[NUM+1];
int main()
{
int i,k,flag,not_finish=1,count=0;
i=1;/*正在處理的元素下標,表示前i-1個元素已符合要求,正在處理第i個元素*/
a[1]=1;/*為數組的第一個元素賦初值*/
cout<<"8皇後可能的結果:"<<endl;
while(not_finish) /*not_finish=1:處理尚未結束*/
{
while(not_finish&&i<=NUM)/*處理尚未結束且還沒處理到第NUM個元素*/
{
for(flag=1,k=1;flag&&k<i;k++)/*判斷是否有多個皇後在同一行*/
if(a[k]==a[i])flag=0;
for(k=1;flag&&k<i;k++) /*判斷是否有多個皇後在同一對角線*/
if((a[i]==a[k]-(k-i))||(a[i]==a[k]+(k-i))) flag=0;
if(!flag)
{
if(a[i]==a[i-1])/*若a[i]的值已經經過一圈追上a[i-1]的值*/
{
i--;/*退回一步,重新試探處理前一個元素*/
if(i>1&&a[i]==NUM)
a[i]=1;/*當a[i]為NUM時將a[i]的值置1*/
else if(i==1&&a[i]==NUM)
not_finish=0;/*當第一位的值達到NUM時結束*/
else a[i]++;
}
else if(a[i]==NUM) a[i]=1;
else a[i]++;/*將a[i]的值取下一個值*/
}
else if(++i<=NUM)
if(a[i-1]==NUM) a[i]=1;/*若前一個元素的值為NUM則a[i]=1*/
else a[i]=a[i-1]+1; /*否則元素的值為前一個元素的下一個值*/
}
if(not_finish)
{
++count;
if((count-1)%3==0) cout<<endl;
cout<<"["<<count<<"]:";
for(k=1;k<=NUM;k++)/*輸出結果*/
cout<<a[k];
cout<<" ";
if(a[NUM-1]<NUM) a[NUM-1]++;/*修改倒數第二位的值*/
else a[NUM-1]=1;
i=NUM-1; /*開始尋找下一個足條件的解*/
}
}
}

③ C語言八皇後的問題。 需要代碼,外加步驟解釋。謝謝

#include
<stdlib.h>
#include
<stdio.h>
int
m[8][8]
=
{0};//表示棋盤,初始為0,表示未放置皇後
int
num
=
0;//解數目
//對於棋盤前row-1行已放置好皇後
//檢查在第row行、第column列放置一枚皇後是否可行
bool
check(int
row,int
column)
//
1,1
2,1
2,2
2,3
{
if(row==1)
return
true;
int
i,j;
//縱向只能有一枚皇後
for(i=0;i<=row-2;i++)
{
if(m[i][column-1]==1)
return
false;
}
//左上至右下只能有一枚皇後

//
i
=
row-2;
//
j
=
i-(row-column);

//
row
-
2
-
row
+
column
i
=
row
-
2;
j
=
column
-
2;
while(i>=0&&j>=0)
{
if(m[i][j]==1)
return
false;
i--;
j--;
}
//右上至左下只能有一枚皇後
i
=
row-2;
//
j
=
row+column-i-2;
j
=
column;
while(i>=0&&j<=7)
{
if(m[i][j]==1)
return
false;
i--;
j++;
//當已放置8枚皇後,為
}
return
true;
}
//可行解時,輸出棋盤
void
output()
{
int
i,j;
num++;
printf("answer
%d:
",num);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
printf("%d
",m[i][j]);
printf("
");
}
}
//採用遞歸函數實現八皇後回溯演算法
//該函數求解當棋盤前row-1行已放置好皇後,在第row行放置皇後
void
solve(int
row)
{
int
j;
//考慮在第row行的各列放置皇後
for
(j=0;j<8;j++)
{
//在其中一列放置皇後
m[row-1][j]
=
1;

//
1,0
//檢查在該列放置皇後是否可行
if
(check(row,j+1)==true)
{
//若該列可放置皇後,且該列為最後一列,則找到一可行解,輸出
if(row==8)
output();
//若該列可放置皇後,則向下一行,繼續搜索、求解
else
solve(row+1);
}
//取出該列的皇後,進行回溯,在其他列放置皇後
m[row-1][j]
=
0;
}
}
//主函數
int
main()
{
//求解八皇後問題
solve(1);
return
0;
}
/*
0
1
2
3
4
5
6
7
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0
0
3
0
0
0
0
0
0
0
0
4
0
0
0
0
0
0
0
0
5
0
0
0
0
0
0
0
0
6
0
0
0
0
0
0
0
0
7
0
0
0
0
0
0
0
0

*/

④ 用C語言編寫八皇後問題

如下是8皇後的程序:
#include<stdio.h>
#include<stdlib.h>
void eightqueen(int a[][99],int n);
void print(int a[][99]);
int up(int a[][99],int row,int col);
int down(int a[][99],int row,int col);
int left(int a[][99],int row,int col);
int right(int a[][99],int row,int col);
int num=0;
main()
{
int a[99][99]={0},n; //將皇後的位置放在一個二維的數組裡面,a[i][j]=1表示該位置有一個皇後
eightqueen(a,0);

system("pause");
return 0;
}

void print(int a[][99]) //輸出當前的一種合理的走法。
{
int i,row,col;
printf("Case %d\n",num);
for(row=0;row<8;row++)
{

for(col=0;col<8;col++)
{
printf("%d ",a[row][col]);
}
printf("\n");

}
printf("\n");
}
void eightqueen(int a[][99],int row) //通過回溯法計算8皇後的走法。
{
int col,i;
for(col=0;col<=7;col++)
{

//判斷都前位置是否是合理的位置。
if ((up(a,row,col)==0)&&(down(a,row,col)==0)&&(left(a,row,col)==0)&&(right(a,row,col)==0))
{
a[row][col]=1; //如果是,將當前位置置為1(擺放一個皇後)
if(row==7) //所有的8個皇後都已經擺放好了,輸出當前的情況。
{
num++;
print(a);
}
else
{
eightqueen(a,row+1); //在row+1擺放下一個皇後。
}
a[row][col]=0;
}
}
}
//判斷同一行列是否有其他的皇後
int up(int a[][99],int row,int col)
{
int i;
for(i=0;i<8;i++)
{
if(a[i][col]==1)
{
return 1;
}
}
return 0;
}
//判斷同一行上是否有其他的皇後
int down(int a[][99],int row,int col)
{
int i;
for(i=0;i<8;i++)
{
if(a[row][i]==1)
{
return 1;
}
}
return 0;
}

//判斷左上到右下的對接線上是否有其他的皇後
int left(int a[][99],int row,int col)
{
int i;
for(i=0;i<8;i++)
{
if(((row+i)<8)&&((col+i)<8))
{
if(a[row+i][col+i]==1)
{
return 1;
}
}
if(((row-i)>=0)&&((col-i)>=0))
{
if(a[row-i][col-i]==1)
{
return 1;
}
}

}
return 0;
}
//判斷左下到右上的對接線上是否有其他的皇後
int right(int a[][99],int row,int col)
{
int i;
for(i=0;i<8;i++)
{
if(((row+i)<8)&&((col-i)>=0)) //
{
if(a[row+i][col-i]==1)
{
return 1;
}
}
if(((row-i)>=0)&&((col+i)<8)) //這兒的判斷有問題,
{
if(a[row-i][col+i]==1)
{
return 1;
}
}

}
return 0;
}

⑤ 求C++語言版用回溯法解決八皇後問題的代碼

#include <fstream>
#include <bitset>
#include <vector>

using namespace std;

ofstream cout("out.txt");

void BitSetTest()
{
const int n = 4;
for (int i = 0; i < 16; i++)
cout << bitset<4>(i) << endl;
}

class Enum
{
protected:
vector<int> A;
int M, N;
void Print()
{
for (int i = 0; i < N; i++)
cout << A[i];
cout << endl;
}
virtual bool Valid(int k) {return true;}
public:
Enum(int m, int n): M(m), N(n), A(n) {}
void Generate(int k)
{
if (k == N)
Print();
else
for (A[k] = 0; A[k] < M; A[k]++)
if (Valid(k))
Generate(k + 1);
}
void Generate()
{
int k = 0;
A[k] = -1;
while (k >= 0)
{
A[k]++;
if (A[k] == M)
k--;
else if (Valid(k))
{
if (k == N - 1)
Print();
else
A[++k] = -1;
}
}
}
};

class Perm: public Enum
{
virtual bool Valid(int k)
{
bool v = true;
for (int i = 0; v && i < k; i++)
v = A[k] != A[i];
return v;
}

public:
Perm(int n): Enum(n, n) {}
};

class nQueens: public Enum
{
virtual bool Valid(int k)
{
bool v = true;
for (int i = 0; v && i < k; i++)
v = A[k] != A[i] && k - i != abs(A[k] - A[i]);
return v;
}

public:
nQueens(int n): Enum(n, n) {}
};

int main()
{
nQueens(8).Generate();

return 0;
}

⑥ 八皇後問題,數據結構(C語言版)

樓下的代碼有點問題啊,是這樣的,剛測試調試通過過

如還有問題Q我523117894
#include <stdio.h>
enum boolean { FALSE , TRUE };
enum boolean a[9] , b[17] , c[17] ;//檢查皇後之間是否沖突
int s[9];
void main()
{
int i=1,j=1;
int cj=1;
while(i<=8)
{
for(j=cj;j<=8;j++)
if(!a[j] && !b[i+j] && !c[i-j+9]) break;
if(j<=8)
{
s[i]=j;
a[j]=TRUE;
b[i+j]=TRUE;
c[i-j+9]=TRUE;
i++;
cj=1;
}
else
{
i--;
j=s[i];
a[j]=FALSE;
b[i+j]=FALSE;
c[i-j+9]=FALSE;
cj=j+1;
}
}
for(i=1;i<=8;i++)
{
for(j=1;j<=8;j++)
{
if(s[i]==j)
printf("%d ",s[i]);
else
printf("- ");
}
printf("\n");
}
}

⑦ 八皇後問題的C語言代碼

#include <math.h>
#include <stdio.h>
#define MAX 8 /* 棋子數及棋盤大小MAXxMAX */
int board[MAX];

/* 印出結果 */
void show_result()
{
int i;
for(i=0;i<MAX;i++)
printf("(%d,%d)",i,board[i]);
printf("\n");
}

/* 檢查是否在同一直橫斜線上有其它棋子 */
int check_cross(int n)
{
int i;
for(i=0;i<n;i++){
if(board[i]==board[n] || (n-i)==abs(board[i]-board[n]))return 1;
}
return 0;
}

/* 放棋子到棋盤上 */
void put_chess(int n)
{
int i;
for(i=0;i<MAX;i++){
board[n]=i;
if(!check_cross(n)){
if(n==MAX-1) show_result();/* 找到其中一種放法了...印出結果 */
else put_chess(n+1);
}
}
}

void main()
{
clrscr();
puts("The possible placements are:");
put_chess(0);
puts("\n Press any key to quit...");
getch();
return;
}


到底是哪些奇葩老師布置的作業?

⑧ 求教C語言回溯法寫出八皇後問題的92種解

(1)全排列

將自然數1~n進行排列,共形成n!中排列方式,叫做全排列。

例如3的全排列是:1/2/3、1/3/2、2/1/3、2/3/1、3/1/2、3/2/1,共3!=6種。

(2)8皇後(或者n皇後)

保證8個皇後不能互相攻擊,即保證每一橫行、每一豎行、每一斜行最多一個皇後。

我們撇開第三個條件,如果每一橫行、每一豎行都只有一個皇後。

將8*8棋盤標上坐標。我們討論其中的一種解法:

- - - - - - - Q

- - - Q - - - -

Q - - - - - - -

- - Q - - - - -

- - - - - Q - -

- Q - - - - - -

- - - - - - Q -

- - - - Q - - -

如果用坐標表示就是:(1,8) (2,4) (3,1) (4,3) (5,6) (6,2) (7,7) (8,5)

將橫坐標按次序排列,縱坐標就是8/4/1/3/6/2/7/5。這就是1~8的一個全排列。

我們將1~8的全排列存入輸入a[]中(a[0]~a[7]),然後8個皇後的坐標就是(i+1,a[i]),其中i為0~7。

這樣就能保證任意兩個不會同一行、同一列了。

置於斜行,你知道的,兩個點之間連線的斜率絕對值為1或者-1即為同一斜行,充要條件是|x1-x2|=|y1-y2|(兩個點的坐標為(x1,y1)(x2,y2))。我們在輸出的時候進行判斷,任意兩個點如果滿足上述等式,則判為失敗,不輸出。

下面附上代碼:添加必要的注釋,其中全排列的實現看看注釋應該可以看懂:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
intprinted;
//該函數用於畫圖,這里為了節約空間則略去
//讀者只需要將draw(a,k);去掉注釋即可畫圖
voiddraw(int*a,intk)
{
inti,j;
for(i=0;i<k;i++)
{
printf(" ");
for(j=0;j<k;j++)
//有皇後輸出Q,否則輸出-
if(a[i]-1==j)printf("Q");elseprintf("-");
printf(" ");
}
printf(" ");

}
//遞歸實現全排列,a是數組,iStep是位置的測試點,k是皇後的個數,一般等於8
voidSettle(int*a,intiStep,intk)
{
inti,j,l,flag=1;
//如果iStep的數字等於a之前的數字,則存在重復,返回
for(i=0;i<iStep-1;i++)
if(a[iStep-1]==a[i])return;
//如果iStep==k,即遞歸結束到最後一位,可以驗證是否斜行滿足
if(iStep==k)
{
//雙重循環判斷是否斜行滿足
for(j=0;j<k;j++)
for(l=0;l<k&&l!=j;l++)
//如果不滿足,則flag=0
if(fabs(j-l)==fabs(a[j]-a[l]))flag=0;
//如果flag==1,則通過了斜行的所有測試,輸出。
if(flag)
{
for(i=0;i<k;i++)
printf("(%d,%d)",i+1,a[i]);
printf(" ");
//如果去掉這里的注釋可以獲得畫圖,由於空間不夠,這里略去
// draw(a,k);
//printed變數計算有多少滿足題意的結果,是全局變數
printed++;
}
flag=1;
}
//如果未測試至最後末尾,則測試下一位(遞歸)
for(i=1;i<=k;i++)
{
a[iStep]=i;
Settle(a,iStep+1,k);
}
}
voidmain()
{
int*a;
intk;
//輸入維數,建立數組
printf("Enterthesizeofthesquare:");
scanf("%d",&k);
a=(int*)calloc(k,sizeof(int));
//清屏,從iStep=0處進入遞歸
system("cls");
Settle(a,0,k);
//判斷最後是否有結果
if(!printed)printf("Noanswersaccepted! ");
elseprintf("%dstatesavailable! ",printed);
}
附輸出結果(輸入k=8):
(1,1)(2,5)(3,8)(4,6)(5,3)(6,7)(7,2)(8,4)
(1,1)(2,6)(3,8)(4,3)(5,7)(6,4)(7,2)(8,5)
(1,1)(2,7)(3,4)(4,6)(5,8)(6,2)(7,5)(8,3)
(1,1)(2,7)(3,5)(4,8)(5,2)(6,4)(7,6)(8,3)
(1,2)(2,4)(3,6)(4,8)(5,3)(6,1)(7,7)(8,5)
(1,2)(2,5)(3,7)(4,1)(5,3)(6,8)(7,6)(8,4)
(1,2)(2,5)(3,7)(4,4)(5,1)(6,8)(7,6)(8,3)
(1,2)(2,6)(3,1)(4,7)(5,4)(6,8)(7,3)(8,5)
(1,2)(2,6)(3,8)(4,3)(5,1)(6,4)(7,7)(8,5)
(1,2)(2,7)(3,3)(4,6)(5,8)(6,5)(7,1)(8,4)
(1,2)(2,7)(3,5)(4,8)(5,1)(6,4)(7,6)(8,3)
(1,2)(2,8)(3,6)(4,1)(5,3)(6,5)(7,7)(8,4)
(1,3)(2,1)(3,7)(4,5)(5,8)(6,2)(7,4)(8,6)
(1,3)(2,5)(3,2)(4,8)(5,1)(6,7)(7,4)(8,6)
(1,3)(2,5)(3,2)(4,8)(5,6)(6,4)(7,7)(8,1)
(1,3)(2,5)(3,7)(4,1)(5,4)(6,2)(7,8)(8,6)
(1,3)(2,5)(3,8)(4,4)(5,1)(6,7)(7,2)(8,6)
(1,3)(2,6)(3,2)(4,5)(5,8)(6,1)(7,7)(8,4)
(1,3)(2,6)(3,2)(4,7)(5,1)(6,4)(7,8)(8,5)
(1,3)(2,6)(3,2)(4,7)(5,5)(6,1)(7,8)(8,4)
(1,3)(2,6)(3,4)(4,1)(5,8)(6,5)(7,7)(8,2)
(1,3)(2,6)(3,4)(4,2)(5,8)(6,5)(7,7)(8,1)
(1,3)(2,6)(3,8)(4,1)(5,4)(6,7)(7,5)(8,2)
(1,3)(2,6)(3,8)(4,1)(5,5)(6,7)(7,2)(8,4)
(1,3)(2,6)(3,8)(4,2)(5,4)(6,1)(7,7)(8,5)
(1,3)(2,7)(3,2)(4,8)(5,5)(6,1)(7,4)(8,6)
(1,3)(2,7)(3,2)(4,8)(5,6)(6,4)(7,1)(8,5)
(1,3)(2,8)(3,4)(4,7)(5,1)(6,6)(7,2)(8,5)
(1,4)(2,1)(3,5)(4,8)(5,2)(6,7)(7,3)(8,6)
(1,4)(2,1)(3,5)(4,8)(5,6)(6,3)(7,7)(8,2)
(1,4)(2,2)(3,5)(4,8)(5,6)(6,1)(7,3)(8,7)
(1,4)(2,2)(3,7)(4,3)(5,6)(6,8)(7,1)(8,5)
(1,4)(2,2)(3,7)(4,3)(5,6)(6,8)(7,5)(8,1)
(1,4)(2,2)(3,7)(4,5)(5,1)(6,8)(7,6)(8,3)
(1,4)(2,2)(3,8)(4,5)(5,7)(6,1)(7,3)(8,6)
(1,4)(2,2)(3,8)(4,6)(5,1)(6,3)(7,5)(8,7)
(1,4)(2,6)(3,1)(4,5)(5,2)(6,8)(7,3)(8,7)
(1,4)(2,6)(3,8)(4,2)(5,7)(6,1)(7,3)(8,5)
(1,4)(2,6)(3,8)(4,3)(5,1)(6,7)(7,5)(8,2)
(1,4)(2,7)(3,1)(4,8)(5,5)(6,2)(7,6)(8,3)
(1,4)(2,7)(3,3)(4,8)(5,2)(6,5)(7,1)(8,6)
(1,4)(2,7)(3,5)(4,2)(5,6)(6,1)(7,3)(8,8)
(1,4)(2,7)(3,5)(4,3)(5,1)(6,6)(7,8)(8,2)
(1,4)(2,8)(3,1)(4,3)(5,6)(6,2)(7,7)(8,5)
(1,4)(2,8)(3,1)(4,5)(5,7)(6,2)(7,6)(8,3)
(1,4)(2,8)(3,5)(4,3)(5,1)(6,7)(7,2)(8,6)
(1,5)(2,1)(3,4)(4,6)(5,8)(6,2)(7,7)(8,3)
(1,5)(2,1)(3,8)(4,4)(5,2)(6,7)(7,3)(8,6)
(1,5)(2,1)(3,8)(4,6)(5,3)(6,7)(7,2)(8,4)
(1,5)(2,2)(3,4)(4,6)(5,8)(6,3)(7,1)(8,7)
(1,5)(2,2)(3,4)(4,7)(5,3)(6,8)(7,6)(8,1)
(1,5)(2,2)(3,6)(4,1)(5,7)(6,4)(7,8)(8,3)
(1,5)(2,2)(3,8)(4,1)(5,4)(6,7)(7,3)(8,6)
(1,5)(2,3)(3,1)(4,6)(5,8)(6,2)(7,4)(8,7)
(1,5)(2,3)(3,1)(4,7)(5,2)(6,8)(7,6)(8,4)
(1,5)(2,3)(3,8)(4,4)(5,7)(6,1)(7,6)(8,2)
(1,5)(2,7)(3,1)(4,3)(5,8)(6,6)(7,4)(8,2)
(1,5)(2,7)(3,1)(4,4)(5,2)(6,8)(7,6)(8,3)
(1,5)(2,7)(3,2)(4,4)(5,8)(6,1)(7,3)(8,6)
(1,5)(2,7)(3,2)(4,6)(5,3)(6,1)(7,4)(8,8)
(1,5)(2,7)(3,2)(4,6)(5,3)(6,1)(7,8)(8,4)
(1,5)(2,7)(3,4)(4,1)(5,3)(6,8)(7,6)(8,2)
(1,5)(2,8)(3,4)(4,1)(5,3)(6,6)(7,2)(8,7)
(1,5)(2,8)(3,4)(4,1)(5,7)(6,2)(7,6)(8,3)
(1,6)(2,1)(3,5)(4,2)(5,8)(6,3)(7,7)(8,4)
(1,6)(2,2)(3,7)(4,1)(5,3)(6,5)(7,8)(8,4)
(1,6)(2,2)(3,7)(4,1)(5,4)(6,8)(7,5)(8,3)
(1,6)(2,3)(3,1)(4,7)(5,5)(6,8)(7,2)(8,4)
(1,6)(2,3)(3,1)(4,8)(5,4)(6,2)(7,7)(8,5)
(1,6)(2,3)(3,1)(4,8)(5,5)(6,2)(7,4)(8,7)
(1,6)(2,3)(3,5)(4,7)(5,1)(6,4)(7,2)(8,8)
(1,6)(2,3)(3,5)(4,8)(5,1)(6,4)(7,2)(8,7)
(1,6)(2,3)(3,7)(4,2)(5,4)(6,8)(7,1)(8,5)
(1,6)(2,3)(3,7)(4,2)(5,8)(6,5)(7,1)(8,4)
(1,6)(2,3)(3,7)(4,4)(5,1)(6,8)(7,2)(8,5)
(1,6)(2,4)(3,1)(4,5)(5,8)(6,2)(7,7)(8,3)
(1,6)(2,4)(3,2)(4,8)(5,5)(6,7)(7,1)(8,3)
(1,6)(2,4)(3,7)(4,1)(5,3)(6,5)(7,2)(8,8)
(1,6)(2,4)(3,7)(4,1)(5,8)(6,2)(7,5)(8,3)
(1,6)(2,8)(3,2)(4,4)(5,1)(6,7)(7,5)(8,3)
(1,7)(2,1)(3,3)(4,8)(5,6)(6,4)(7,2)(8,5)
(1,7)(2,2)(3,4)(4,1)(5,8)(6,5)(7,3)(8,6)
(1,7)(2,2)(3,6)(4,3)(5,1)(6,4)(7,8)(8,5)
(1,7)(2,3)(3,1)(4,6)(5,8)(6,5)(7,2)(8,4)
(1,7)(2,3)(3,8)(4,2)(5,5)(6,1)(7,6)(8,4)
(1,7)(2,4)(3,2)(4,5)(5,8)(6,1)(7,3)(8,6)
(1,7)(2,4)(3,2)(4,8)(5,6)(6,1)(7,3)(8,5)
(1,7)(2,5)(3,3)(4,1)(5,6)(6,8)(7,2)(8,4)
(1,8)(2,2)(3,4)(4,1)(5,7)(6,5)(7,3)(8,6)
(1,8)(2,2)(3,5)(4,3)(5,1)(6,7)(7,4)(8,6)
(1,8)(2,3)(3,1)(4,6)(5,2)(6,5)(7,7)(8,4)
(1,8)(2,4)(3,1)(4,3)(5,6)(6,2)(7,7)(8,5)
92statesavailable!

⑨ 用c語言解決八皇後問題,要求第一個皇後位置用鍵盤輸入,需要詳細代碼和解釋,謝謝、

#include "stdio.h"
#include "math.h"
int row[8];
void arrange(int k)
{
int i,j;
if(k>8){
for(i = 1;i<=8;i++)
printf("%2d\n",row[i]);//k>8時應該輸出各列皇後的行號
return ;
}

for(j = 1;j <=8;j++) //試探第k列的每一個行號
{
for(i = 1;i <k ;i++)
if(row [i] == j || (k-i) == abs(row[i] - j))
break;
if(i>=k) //成立說明第k列的第j行可用,則放置一個皇後
{
row [k] = j;
arrange(k+1); //安排第k+1列至第八列皇後
}
}
}
void main()
{
arrange(1);
}
這是全部八皇後的可能性的代碼,其中主要演算法以及有了,相信你可以自己改出來的,否則直接給你的話就沒有意義了。。。

聲明,這段代碼摘自西南交大《c程序設計教程》。。。

⑩ 求八皇後問題C語言源代碼!急!

/*
* File: queen.c
* Description: 求 8 皇後問題回溯演算法
* Created: 2001/11/12
* Author: Justin Hou [mailto:[email protected]]
*/
#include <stdio.h>

#define DelayTime 20000 /* 顯示棋局時間 */
#define TopX 10 /* 棋盤左上角 x 坐標 */
#define TopY 5 /* 棋盤左上角 y 坐標 */

int N = 8; /* 皇後數量 */

int a[8], b[15], c[15];
/*
* a[col-1] 記錄第 col 列有無皇後, 1 表示有。
* b[row+col-2] 記錄從左上數第 row+col-1 條斜率為 1 的線上有無皇後。
* c[row-col+7] 記錄從右上數第 row-col+8 條斜率為 -1 的線上有無皇後。
*/
int Num = 0;
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)
{
a[col-1] = 1; /* 更改數據 */
b[row+col-2] = 1;
c[row-col+N-1] = 1;

gotoxy(col*2 + TopX, row + TopY); /* 畫皇後 */
putch('Q');

if (row < N)
{
BackTrack (row + 1);
}
else
{
Num++; /* 遞歸終點 */
gotoxy(40, 9);
printf("Num: %d ", Num);
delay(DelayTime);
}

a[col-1] = 0; /* 清空數據 */
b[row+col-2] = 0;
c[row-col+N-1] = 0;

gotoxy(col*2 + TopX, row + TopY); /* 清除圖象 */
putch('.');

}/* end if */
}/* end for */
}/* end function BackTrack */

void main()
{
int i, j;
clrscr();

gotoxy(1, 10); /* 要求用戶輸入皇後數量 */
printf("Input the number of queen: ");
while(N <= 0 || N > 14)
{
scanf("%d", &N);
if(N > 14) printf("Two huge number, input again:");
if(N <= 0) printf("Can's smaller than 1, again:");
}

clrscr();

for(i=1; i<=N; i++) /* 畫棋盤(Chessboard) */
{
for(j=1; j<=N; j++)
{
gotoxy(i*2 + TopX, j + TopY);
putch('.');
}
}

BackTrack(1); /* 開始回溯演算法 */

gotoxy(12, 17); /* 顯示最後結果 */
printf ("There are %d kinds of solution.\n", Num);

getch();
}