@[Channel_09](/user/787888)
考虑一件事:
有以下矩阵
```
67 75 63 10
29 29 92 14
21 68 71 56
8 67 91 25
```
当选择第1行第1列的`67`和第3行第2列的`68`时,在回溯掉`68`时:
```cpp
for (int i = 0;i < 8;++i)
{
vis[x + dx[i]][y + dy[i]] = false;
}
```
这串代码会把原先第一次选取时的标记去掉
原先的`vis`数组是这样的:
```
1 1 0 0
1 1 1 0
1 1 1 0
1 1 1 0
```
正确的去掉标记:
```
1 1 0 0
1 1 0 0
0 0 0 0
0 0 0 0
```
您代码去掉标记后:
```
1 1 0 0
0 0 0 0
0 0 0 0
0 0 0 0
```
导致会多选数
改成下面的就好了:
```cpp
if (!vis[x][y]) {
ans += a[x][y];
for (int i = 0; i < 8; ++i) {
vis[x + dx[i]][y + dy[i]] ++;
}
dfs(x, y + 1);
ans -= a[x][y];
for (int i = 0; i < 8; ++i) {
vis[x + dx[i]][y + dy[i]] --;
}
}
```
by jubingkun @ 2023-08-25 11:36:50
@[jubingkun](/user/945545) 这样吗,但是我没过样例的时候看过题解,就是上面这样的,我还疑惑++是不是true,--是不是false,谢谢大佬
by Channel_09 @ 2023-08-27 19:11:53
@[jubingkun](/user/945545) 确实很有收获
by YTUGGBOY @ 2023-10-24 21:38:42