碁盤問題POJ-1321(DFS)
3394 ワード
碁盤問題POJ-1321
Input入力には複数のテストデータが含まれています.各グループのデータの最初の行は2つの正の整数、n kであり、1つのスペースで区切られ、1つのn*nのマトリクス内に碁盤を記述し、駒を置く数を示す.n<=8,k<=nは−1−1で入力終了を示す.次のn行は、各行にn文字を有する碁盤の形状を示す.空白領域を表します(データは余分な空白行や空白列が現れないことを保証します).Outputは、各セットのデータに対して、1行の出力を与え、配置されたシナリオ数Cを出力する(データ保証C<2^31).Sample Input
Sample Output
タイトル:
1つのn*nの図を与えて、k個の駒と、#の上で駒を放して、1行ごとに1つの駒の方案の数だけあることを要求していくらあります
分析:
1枚だけ行えばいいので、配列に列をマークして、この列に駒があるかどうかを見て、dfsに下ります.
久しぶりに検索を书いて、今日最も简単なものを探してすべて书いていないで、本当にtmd料理は犬になりました
code:
( ) , 。 , , k C。
Input入力には複数のテストデータが含まれています.各グループのデータの最初の行は2つの正の整数、n kであり、1つのスペースで区切られ、1つのn*nのマトリクス内に碁盤を記述し、駒を置く数を示す.n<=8,k<=nは−1−1で入力終了を示す.次のn行は、各行にn文字を有する碁盤の形状を示す.空白領域を表します(データは余分な空白行や空白列が現れないことを保証します).Outputは、各セットのデータに対して、1行の出力を与え、配置されたシナリオ数Cを出力する(データ保証C<2^31).Sample Input
2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1
Sample Output
2
1
タイトル:
1つのn*nの図を与えて、k個の駒と、#の上で駒を放して、1行ごとに1つの駒の方案の数だけあることを要求していくらあります
分析:
1枚だけ行えばいいので、配列に列をマークして、この列に駒があるかどうかを見て、dfsに下ります.
久しぶりに検索を书いて、今日最も简単なものを探してすべて书いていないで、本当にtmd料理は犬になりました
code:
#include
#include
#include
using namespace std;
bool vis[20];// i
char mp[20][20];
int n,k,ans;
void dfs(int x,int s){// x , s
if(s == k){
ans++;
return;
}
for(int i = x; i < n; i++){
for(int j = 0; j < n; j++){
if(!vis[j] && mp[i][j] == '#'){
vis[j] = 1;
dfs(i+1,s+1);
vis[j] = 0;
}
}
}
}
int main(){
while(~scanf("%d%d",&n,&k)){
if(n == -1 && k == -1) break;
for(int i = 0; i < n; i++){
scanf("%s",mp[i]);
}
memset(vis,0,sizeof(vis));
ans = 0;
dfs(0,0);
printf("%d
",ans);
}
return 0;
}