pku 1321 棋盘问题

http://poj.org/problem?id=1321  题目没什么好说的,算是dfs里面的一道水题。

 1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 using namespace std;
5 #define N 10
6 char str[N][N];
7 int r[N],c[N]; // r 用来标记该行已经有旗子放了,c用来标记该列有棋子放上了
8 int sum,num;
9 int n,k;
10 void dfs(int x)
11 {
12 int i,j;
13 if(num == k) {sum++ ; return ;}
14 for(i = x; i < n; i++)
15 {
16 for(j = 0; j < n; j++)
17 {
18 if(str[i][j] == '#' && !r[i] && !c[j])
19 {
20 num++ ;
21 r[i] = 1;
22 c[j] = 1;
23 dfs(i+1);
24 num--;
25 r[i] = 0;
26 c[j] = 0;
27 }
28 }
29 }
30 }
31 int main()
32 {
33 int i,j;
34 while(cin>>n>>k)
35 {
36 if(n == -1 && k == -1) break;
37 for(i = 0; i < n; i++)
38 {
39 r[i] = c[i] = 0;
40 for(j = 0; j < n;j++)
41 {
42 cin>>str[i][j];
43 v[i][j] = 0;
44 }
45 }
46 sum = 0;
47 for(i = 0; i < n; i++)
48 {
49 for(j = 0; j < n;j++)
50 if(str[i][j] == '#')
51 {
52 r[i] = 1;
53 c[j] = 1;
54 num = 1;
55 dfs(i+1);
56 r[i] = 0; // 记得恢复初值
57 c[j] = 0; // 记得恢复初值
58 }
59 }
60 cout<<sum<<endl;
61 }
62 return 0;
63 }
原文地址:https://www.cnblogs.com/fxh19911107/p/2408500.html