###### tags: `I2P(I)Hu2022`
# 13680 - Mr Bean
> by schdoel
## Brief
Place 8 queens on the chessboard such that no queen threatens one another. Sum of the nmbers on the chessboard selected is the minimum.
## Solution
Apply DFS to the array, while storing the accumulated value during the path.
You can store some informations to make the DFS more efficient:
- Which column already has queens
- Which diagonal line already has queens
- The current highest and second-highest weighted sum
## Reference Code
```cpp=
#include <stdio.h>
int a[8];
int b[8][8];
int small = 2147483647;
int all = 0;
int testcount;
int count(int side) {
int stop;
for (int i = 0; i < 9; i++) {
a[side] = i;
if (i == 8) return small;
stop = 0;
for (int j = 0; j < side; j++) {
if (a[side] == a[j] || side + a[side] == j + a[j] ||
side - a[side] == j - a[j]) {
stop = 1;
}
}
if (side == 7 && stop == 0) {
all = 0;
for (int k = 0; k < 8; k++) all += b[k][a[k]];
testcount += 1;
small = (all > small) ? small : all;
} else if (stop == 0) small = count(side + 1);
}
return small;
}
int main(void) {
int n;
scanf("%d", &n);
int ans[n];
for (int h = 0; h < n; h++) {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
scanf("%d", &b[i][j]);
}
}
for (int i = 0; i < 8; i++) {
a[i] = -1;
}
small = 2147483647;
testcount = 0;
ans[h] = count(0);
}
for (int h = 0; h < n; h++) {
printf("%d", ans[h]);
printf("\n");
}
return 0;
}
```