样例解析
(左右不同,所以有的路径看似相同实则不同)
input:2
output:2
input:3
output:2
input:4
output:4
input:5
output:2
测试数据只有80个,可以打表
代码:
//测试样例通过,超时
#include<bits/stdc++.h>
using namespace std;
int vis[100],sum[100],ans;
void dfs(int i,int x,int n){
if(x==n){
ans++;
return;
}
int r=(i+x+n)%n;//向右走
if(r==0)r=n;
int l=(i-x+n)%n;//向左走
if(l==0)l=n;
if(vis[r]==0){
vis[r]=1;
dfs(r,x+1,n);
vis[r]=0;
}
if(vis[l]==0){
vis[l]=1;
dfs(l,x+1,n);
vis[l]=0;
}
return;
}
int main(){
int t,x;
scanf("%d",&t);
for(int i=1;i<=t;i++){
scanf("%d",&x);
memset(vis,0,sizeof(vis));
ans=0;
vis[1]=1;
dfs(1,1,x);
printf("%d\n",ans);
}
return 0;
}
直接打表保存在数组
#include<bits/stdc++.h>
using namespace std;
int vis[100],sum[100],ans;
void dfs(int i,int x,int n){
if(x==n){
ans++;
return;
}
int r=(i+x+n)%n;
if(r==0)r=n;
int l=(i-x+n)%n;
if(l==0)l=n;
if(vis[r]==0){
vis[r]=1;
dfs(r,x+1,n);
vis[r]=0;
}
if(vis[l]==0){
vis[l]=1;
dfs(l,x+1,n);
vis[l]=0;
}
return;
}
int main(){
for(int i=1;i<=80;i++){
memset(vis,0,sizeof(vis));
ans=0;
vis[1]=1;
dfs(1,1,i);
printf("%d,",ans);
}
return 0;
}
输出
1,2,2,4,2,4,4,8,2,4,6,8,2,8,6,16,2,4,6,8,4,12,6,16,4,4,4,16,2,12,10,32,4,4,8,8,2,12,6,16,2,8,6,24,6,12,8,32,6,8,6,8,2,8,10,32,4,4,6,24,2,20,6,64,6,8,8,8,4,16,6,16,2,4,8,24,14,12,6,32,
wa:
#include<bits/stdc++.h>
using namespace std;
/*int vis[100],sum[100],ans;
void dfs(int i,int x,int n){
if(x==n){
ans++;
return;
}
int r=(i+x+n)%n;
if(r==0)r=n;
int l=(i-x+n)%n;
if(l==0)l=n;
if(vis[r]==0){
vis[r]=1;
dfs(r,x+1,n);
vis[r]=0;
}
if(vis[l]==0){
vis[l]=1;
dfs(l,x+1,n);
vis[l]=0;
}
return;
}*/
int ans[120]={1,2,2,4,2,4,4,8,2,4,6,8,2,8,6,16,2,4,6,8,4,12,6,16,4,4,4,16,2,12,10,32,4,4,8,8,2,12,6,16,2,8,6,24,6,12,8,32,6,8,6,8,2,8,10,32,4,4,6,24,2,20,6,64,6,8,8,8,4,16,6,16,2,4,8,24,14,12,6,32};
int main(){
/*for(int i=1;i<=80;i++){
memset(vis,0,sizeof(vis));
ans=0;
vis[1]=1;
dfs(1,1,i);
printf("%d,",ans);
}*/
int t,x;
scanf("%d",&t);
for(int i=1;i<=t;i++){
scanf("%d",&x);
printf("%d\n",ans[x]);//忽略从0开始所以错了
}
return 0;
}
ac:
#include<bits/stdc++.h>
using namespace std;
/*int vis[100],sum[100],ans;
void dfs(int i,int x,int n){
if(x==n){
ans++;
return;
}
int r=(i+x+n)%n;
if(r==0)r=n;
int l=(i-x+n)%n;
if(l==0)l=n;
if(vis[r]==0){
vis[r]=1;
dfs(r,x+1,n);
vis[r]=0;
}
if(vis[l]==0){
vis[l]=1;
dfs(l,x+1,n);
vis[l]=0;
}
return;
}*/
int ans[120]={1,2,2,4,2,4,4,8,2,4,6,8,2,8,6,16,2,4,6,8,4,12,6,16,4,4,4,16,2,12,10,32,4,4,8,8,2,12,6,16,2,8,6,24,6,12,8,32,6,8,6,8,2,8,10,32,4,4,6,24,2,20,6,64,6,8,8,8,4,16,6,16,2,4,8,24,14,12,6,32};
int main(){
/*for(int i=1;i<=80;i++){
memset(vis,0,sizeof(vis));
ans=0;
vis[1]=1;
dfs(1,1,i);
printf("%d,",ans);
}*/
int t,x;
scanf("%d",&t);
for(int i=1;i<=t;i++){
scanf("%d",&x);
printf("%d\n",ans[x-1]);
}
return 0;
}