基礎練習 2n皇后問題 ——回溯法,貪心演算法
基礎練習 2n皇后問題
問題描述
給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后
和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩
個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少种放法?n小於等於8。
輸入格式
輸入的第一行為一個整數n,表示棋盤的大小。
接下來n行,每行n個0或1的整數,如果一個整數為1,表示對應的位置可以放皇后,
如果一個整數為0,表示對應的位置不可以放皇后。
輸出格式
輸出一個整數,表示總共有多少种放法。
樣例輸入
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
樣例輸出
2
樣例輸入
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
樣例輸出
0
*/
#include<stdio.h>
int tongji(int , int , int [][8] , int ,int *);
int check(int , int ,int ,int [][8] , int );
void shuru( int , int [][8]);
int main(void)
{
int n ,sz[8][8];
scanf("%d",&n);
shuru( n , sz );
int sum=0;
printf("%d",tongji(n , 0 , sz , 2 ,&sum));
return 0;
}
int tongji(int n , int x , int sz[][8] , int s ,int *sum)
{
if( x == n )
{
if( s == 2 )
{
tongji(n , 0, sz, 3 , sum );
}
else
{
++ *sum ;
}
return 0;
}
int i ;
for(i = 0 ; i < n ; i ++)
{
if(sz[x][i] != 1)
{
continue;
}
if(check(n , x , i , sz , s ))
{
sz[x][i]=s;
}
else
{
continue;
}
tongji(n , x+1 , sz , s ,sum );
sz[x][i]=1;
}
return * sum;
}
int check(int n , int x ,int y ,int sz[][8] , int s)
{
int i , j;
for( i = x-1 ; i >= 0 ; i --)
{
if(sz[i][y] == s)
{
return 0;
}
}
for(i=x-1,j = y-1 ; i >= 0 && j >= 0; i -- , j --)
{
if(sz[i][j] == s)
{
return 0;
}
}
for(i = x-1,j = y+1;i >= 0 && j < n ; i -- , j ++)
{
if( sz[i][j]== s)
{
return 0;
}
}
return 1;
}
void shuru( int n , int sz[][8])
{
int i , j ;
for( i = 0 ; i < n ; i ++)
{
for( j = 0 ; j < n ; j ++)
{
scanf("%d",&sz[i][j]);
}
}
}