| ||||||||||
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