| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
以行为DFS深度 尝试所放至列 一行可以什么也不放是关键#include <iostream>
#include <cstdio>
int N, cnt, sum;
int X[10];
char M[10][10];
using namespace std;
void DFS(int row, int res){
if(res == cnt){
sum ++;
return;
}
if(row > N || res + 1 + (N - row) < cnt) //如果放到row行,即便N-row行都放置仍然不足要求解树,剪枝。
return;
DFS(row + 1, res); //这一行不放
for(int i = 1; i <= N; ++i){
if(M[row][i] == '#' && !X[i]){
X[i] = 1;
DFS(row + 1, res + 1); //放
X[i] = 0;
}
}
}
int main()
{
while(scanf("%d%d", &N, &cnt) && N + cnt > 0)
{
for(int i = 1; i <= N; ++i){
char tmp[10];
X[1] = 0;
scanf("%s", tmp + 1);
for(int j = 1; j <= N; ++j)
M[i][j] = tmp[j];
}
sum = 0;
DFS(1, 0);
printf("%d\n", sum);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator