我的思路比较复杂,分奇偶数讨论
偶数当中再分别讨论是否为4的倍数,是则以3 4 1 2 7 8 5 6形式输出
否则先写出前六个,然后剩下的以同样形式交换输出
偶数是没有什么问题的,然而讨论奇数的时候好像有点问题,先呈现一下我的原思路
奇数分三类,分别是模3余数为0 1 2
余数为0时,发现n-5为偶数,此时可以用于处理偶数时同样的方法进行输出
余数为1时其实类似,现在两个数一组来进行输出
余数为2时n-5为3的倍数,于是三个数一组进行输出
我试了一些<100的数,感觉规律上没什么错,,,实在是瞪不出来问题了
(但是后来我发现奇数情况可以简化,反正n-5都是偶数,都可以一起讨论,然后我发现这样却可以A
于是想求助一下这个做法到底假在哪里了呜呜呜
#include<cstdio> using namespace std; int main(){ int n; scanf("%d",&n); if(n==3||n==2||n==1||n==7) printf("-1"); else { if(n%2==0){ if((n/2)%2==0){ for(int i=0;i<=n/4-1;i++){ if(i<n/4-1) printf("%d %d %d %d ",4*i+3,4*i+4,4*i+1,4*i+2); else printf("%d %d %d %d",4*i+3,4*i+4,4*i+1,4*i+2); } } else{ if(n==6) printf("3 5 1 6 2 4"); else printf("3 5 1 6 2 4 "); for(int i=0;i<=n/4-2;i++){ if(i<n/4-2) printf("%d %d %d %d ",9+4*i,10+4*i,7+4*i,8+4*i); else printf("%d %d %d %d",9+4*i,10+4*i,7+4*i,8+4*i); } } } else{ if(n%3==0){ if(((n-5)/2)%2==1){ printf("3 5 1 6 2 4 "); for(int i=0;i<=(n-5)/4-2;i++){ printf("%d %d %d %d ",9+4*i,10+4*i,7+4*i,8+4*i); } printf("%d %d %d %d %d",n-1,n,n-4,n-3,n-2); } else{ for(int i=0;i<=(n-5)/4-1;i++){ printf("%d %d %d %d ",4*i+3,4*i+4,4*i+1,4*i+2); } printf("%d %d %d %d %d",n-1,n,n-4,n-3,n-2); } } if(n%3==1){ for(int i=1;i<=(n-5)/2;i++){ if(i%2==1) printf("%d %d ",i*2+1,i*2+2); else printf("%d %d ",i*2-3,i*2-2); } printf("%d %d %d %d %d",n-1,n,n-4,n-3,n-2); } if(n%3==2){ for(int i=1;i<=(n-5)/3;i++){ if(i%2==1) printf("%d %d %d ",i*3+1,i*3+2,i*3+3); else printf("%d %d %d ",i*3-5,i*3-4,i*3-3); } printf("%d %d %d %d %d",n-1,n,n-4,n-3,n-2); } } } return 0; }
全部评论
(2) 回帖