問題の説明
N * Nボードを考えると、ボードは女王のいくつかの位置に置くことはできません。今までブラックボードが配置され、N及びN-クイーンホワイト女王ので、任意の2つの黒いクイーンが同じ行、同じ列または同じ対角線上にないことではなく、同じ列内の任意の2つの白の女王、同じ列や同じ対角線。Q. Aは、どのように多くのプット法の合計しますか?nは8以下です。
入力形式
第一幕入力整数n、ボードのサイズ。
クイーンことができない放電に対応する位置を示す、0の整数である場合、続いてN行の各行nは0又は1の整数であり、クイーンに対応する位置を示す1の整数である場合、配置することができます。
クイーンことができない放電に対応する位置を示す、0の整数である場合、続いてN行の各行nは0又は1の整数であり、クイーンに対応する位置を示す1の整数である場合、配置することができます。
出力フォーマット
出力アン法律を置く種の合計数を表す整数。
サンプル入力
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
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
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
サンプル出力
0
#include <アルゴリズム> の#include <iostreamの> する#include <CStringの> する#include <cstdioを> する#include <ベクトル> の#include <cmath> の#include <キュー> の#include <両端キュー> の#include <cmath> の#include <地図> 使用して名前空間はstdを、 typedefの長い長いLL。#define INF 0x7FFFFFFFで のconst ダブル INF = 1E20; const int型 MAXN = 1000年 + 10 。 const int型のmod = 1E7; CONST ダブル PI = ACOS( - 1 )。 int型 [ 10 ] [ 10 ]。 INT VIS [ 3 ] [ 50 ]。 INTの VIS2 [ 3 ] [ 50 ]。 int型TOT; int型のn; INT C [ 50 ]。 ボイド search_2(int型CUR){ 場合(CUR == N){ TOT ++ 。 } ほか のため(intは iは= 0、I <N; I ++ ){ もし(!VIS2 [ 0 ] [i]は&&!VIS2 [ 1 ] [CUR + I] &&!VIS2 [ 2 ] [CUR-I + N] && A [CUR] [I] == 1 ){ VIS2 [ 0 ] [I] = VIS2 [ 1 ] [CUR + I] = VIS2 [ 2 ] [CUR-I + N] = 1 。 [CUR] [I] = 0 ; search_2(CUR + 1 )。 [CUR] [I] = 1 。 VIS2 [ 0 ] [I] = VIS2 [ 1 ] [CUR + I] = VIS2 [ 2 ] [CUR-I + N] = 0 ; } } } のボイドsearch_(INT CUR){ 場合(CUR == N){ search_2(0 )。 } そう するため(INT iは= 0、I <N; I ++ ){ もし!(VIS [ 0!] [I] && VIS [ 1!] [CUR + I] && VIS [ 2 ] [CUR-I + N] && [CUR] [I] == 1 ){ VIS [ 0 ] [I] = VIS [ 1 ] [CUR + I] = VIS [ 2 ] [CUR-I + N] = 1 。 [CUR] [I] = 0 ; search_(CUR + 1)。 [CUR] [I] = 1 。 VIS [ 0 ] [I] = VIS [ 1 ] [CUR + I] = VIS [ 2 ] [CUR-I + N] = 0 ; } } } int型のmain(){ scanf関数(" %のD "、&N) 以下のために(INT iが= 0 ; I <N; I ++ ){ ため(INT J = 0 ; J <nであり、j ++ ){ scanf関数(" %のD "、および[I] [J])。 } } TOT= 0 ; search_(0 )。 printf(" %dの\ n " 、TOT)。 リターン 0 ; }