乘积最大
字母

使用dfs时可以把答案放在dfs的参数中,也可以将dfs的返回值作为结果。

dfs有返回值时,应该首先明白这个返回值代表的是什么意思。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<iostream>
#include<set>

using namespace std;

const int N = 25;

int n, m;
char g[N][N];
set<char> s;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};

int dfs(int x, int y) {
int res = 0;
for(int i = 0; i < 4; i ++) {
int a = x + dx[i], b = y + dy[i];
if(a < 0 || a >= n || b < 0 || b >= m) continue;
if(!s.count(g[a][b])) {
s.insert(g[a][b]);
res = max(res, dfs(a, b));
s.erase(g[a][b]);
}
}
return res + 1;
}

int main() {
cin >> n >> m;
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
cin >> g[i][j];

s.insert(g[0][0]);
dfs(0, 0);
cout << dfs(0, 0) << endl;

return 0;
}
棋盘问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<iostream>
#include<cstring>

using namespace std;

const int N = 10;

char g[N][N];
int n, k;
bool col[N];
int ans;

void dfs(int u, int x) {
if(x == k) {
ans ++;
return ;
}
if(u == n)
return ;

for(int i = 0; i < n; i ++) {
if(g[u][i] == '#' && !col[i]) {
col[i] = true;
dfs(u + 1, x + 1);
col[i] = false;
}
}
//如果这列没有放棋子的地方,就从下一列去找。
dfs(u + 1, x);
}

int main() {
while(cin >> n >> k , n != -1 && k != -1) {
memset(g, 0, sizeof(g));

ans = 0;
for(int i = 0; i < n; i ++)
cin >> g[i];

dfs(0, 0);

cout << ans << endl;
}
return 0;
}