藍橋杯 基礎訓練 2n皇后的問題
首先要理解8皇后問題
就是8*8的象棋盤上,擺8個皇后,任意兩個棋子不能在同一行,列,對角線上。
代碼:
#include<stdio.h>
int que[8]={0},Count=0;
int Check(int clown,int line) //clown是行,line是列
{
for(int i=0;i<line;i++)
{
int index=que[i];
if(index= =clown) //判斷是否在同一行
return 0;
if((clown+line)= = (i+index)) //是否在同一主對角線
return 0;
if((clown-line)= =(index-i)) //是否在同一副對角線
return 0;
}
return 1;
}
void eight_queen(int line)//列
{
for(int clown=0;clown<8;clown++)
{
if(Check(clown,line))
{
que[line]=clown;//把那一列對應的行數保存下來;
if(line==7)
{
Count++;
que[line]=0;
return;
}
eight_queen(line+1); //遞歸
que[line]=0;
}
}
}
int main()
{
eight_queen(0);
printf("擺放的方式有%d種",Count);
return 0;
}
接下來是2n皇后的問題:
給定一個 n*n 的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入 n 個黑皇后和 n 個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少种放法?n<=8。
輸入的第一行爲一個整數 n,表示棋盤的大小。
接下來n行,每行n個數,1表示可以放置,0表示不可以放置棋子。
代碼如下:
#include<stdio.h>
#include<math.h>
int wque[8]={0};//用來標記白white皇后的行數;
int bque[8]={0};//用來標記黑black皇后
int a[10][10]={0};
int counts=0; //總共多少種方法
int n; //n*n格
int check(int m,int k,int b[]) //檢查是否放置在(m,k)位置是否合適
{
int i,j;
for(i=0;i<k;i++)
{
int index=b[i];
if(index= =m) //檢查行
return 0;
if((i+index)= =(m+k)) //檢查主對角線
return 0;
if((index-i)= =(m-k)) //檢查副對角線
return 0;
}
return 1;
}
void black_queen(int k) //放置黑皇后
{
int i;
if(k= =n)
{
counts++;
return;
}
for(i=0;i<n;i++)
{
if(check(i,k,bque)&& a[i][k] && (i!=wque[k])) // 若a[i][k]=1,而且check()函數檢 查後合適,而且該位置沒有白子,就可以進行放置
{
bque[k]=i;
black_queen(k+1);
bque[k]=0;
}
}
return;
}
void white_queen(int k) //放置白皇后
{
void black_queen(int k);
int i,j;
if(k==n)
{
black_queen(0);
return;
}
for(i=0;i<n;i++)
{
if(check(i,k,wque)&&a[i][k]) //若a[i][k]=1,而且check()函數檢查後合適,就可以進行放置
{
wque[k]=i;
white_queen(k+1);
wque[k]=0;
}
}
}
int main()
{
int i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
white_queen(0); //先放置白皇后,再在白皇后程序調用黑皇后的放置程序
printf("%d",counts);
return 0;
}
----有1纔會有10,最終達到100。
一位學長告訴我的,非常感謝他!