多維陣列------八皇后問題
阿新 • • 發佈:2019-01-22
/*
八皇后問題
在8*8的棋盤上擺放8個皇后,不能處於一排一列或者一斜線上,,使其不能相互攻擊
*/
#include <stdio.h>
#include <math.h> //使用絕對值函式asb
const int N = 100; //最多求100皇后問題
int x[N] = {-1}; //陣列初始化為-1
int Place(int k);
void PrintQueue(int n);
void Queue(int n)
{
int k = 0,num = 0;
while(k>=0) //擺放皇后k,
{
x[k]++; //在下一列擺放皇后k
while(x[k] < n && Place(k) == 1) //發生衝突
x[k]++; //皇后k試探下一列
if(x[k] < n && k==n-1)
{
printf("第%d個解是:",++num);
PrintQueue(n);
}else if(x[k] <n && k<n-1) //尚有皇后未擺放
k = k+1; //準備擺放下一個皇后
else
x[k--] = -1; //重置x[k],回溯,重新擺放皇后k
}
}
int Place(int k) //觀察皇后k放置在x[k]列是否發生衝突
{
for(int i=0;i<k;i++)
if(x[i] == x[k] || abs(i+k) == abs(x[i] - x[k]))
return 1;
return 0;
}
void PrintQueue(int n)
{
for(int i=0;i<n;i++)
printf("%5d",x[i]+1); //陣列下標從0開始,列印的列號從1開始
printf("\n");
}
int main()
{
int n;
printf("請輸入皇后個數(n>=4)");
scanf("%d",&n);
Queue(n);
return 0;
八皇后問題
在8*8的棋盤上擺放8個皇后,不能處於一排一列或者一斜線上,,使其不能相互攻擊
*/
#include <stdio.h>
#include <math.h> //使用絕對值函式asb
const int N = 100; //最多求100皇后問題
int x[N] = {-1}; //陣列初始化為-1
int Place(int k);
void PrintQueue(int n);
void Queue(int n)
{
int k = 0,num = 0;
while(k>=0) //擺放皇后k,
{
x[k]++; //在下一列擺放皇后k
while(x[k] < n && Place(k) == 1) //發生衝突
x[k]++; //皇后k試探下一列
if(x[k] < n && k==n-1)
{
printf("第%d個解是:",++num);
PrintQueue(n);
}else if(x[k] <n && k<n-1) //尚有皇后未擺放
k = k+1; //準備擺放下一個皇后
else
x[k--] = -1; //重置x[k],回溯,重新擺放皇后k
}
}
int Place(int k) //觀察皇后k放置在x[k]列是否發生衝突
{
for(int i=0;i<k;i++)
if(x[i] == x[k] || abs(i+k) == abs(x[i] - x[k]))
return 1;
return 0;
}
void PrintQueue(int n)
{
for(int i=0;i<n;i++)
printf("%5d",x[i]+1); //陣列下標從0開始,列印的列號從1開始
printf("\n");
}
int main()
{
int n;
printf("請輸入皇后個數(n>=4)");
scanf("%d",&n);
Queue(n);
return 0;
}