题目
我的代码
#include <cstdio>
using namespace std;
int t, n, ans;
bool used[80];
void dfs(int i, int p){
if(used[p]) return;
if(i == n){
ans++;
return;
}
used[p] = true;
dfs(i + 1, (p + i) % n);
dfs(i + 1, (p + n - i) % n);
used[p] = false;
}
int main(){
scanf("%d", &t);
while(t--){
ans = 0;
scanf("%d", &n);
dfs(1, 0);
printf("%d\n", ans);
}
return 0;
}
官方题解
#include <bits/stdc++.h>
using namespace std;
int n, cnt, test;
bool b[101];
inline void soso(int step, int cur, int n) {
if (step == n) {
++cnt;
return;
}
int x = cur + step;
if (x > n)
x -= n;
if (!b[x]) {
b[x] = true;
soso(step + 1, x, n);
b[x] = false;
}
x = cur - step;
if (x <= 0)
x += n;
if (!b[x]) {
b[x] = true;
soso(step + 1, x, n);
b[x] = false;
}
}
int main() {
scanf("%d", &test);
for (; test--; ) {
scanf("%d", &n);
cnt = 0;
memset(b, false, sizeof(b));
b[1] = true;
soso(1, 1, n);
printf("%d\n", cnt);
}
}
我真的横竖看不出本质算法有什么区别好吧