首页 > 技术文章 > UESTC - 1607 ad-hoc

caturra 2018-01-18 17:09 原文

#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
using namespace std;
typedef long long ll;
const int maxn  = 100;
int l[maxn],r[maxn],tl[maxn],tr[maxn];
int n;
int main(){
    while(scanf("%d",&n)!=EOF){
        memset(l,0,sizeof l);memset(r,0,sizeof r);
        int cnt=2; rep(i,1,n/2) l[i]=i,r[i]=n-i+1;
        rep(i,1,n/2) printf("%d %d%s",l[i],r[i],i==n/2?"\n":" ");
        while(cnt<=n-1){
            cnt++;
            int tmp=l[2];
            memcpy(tl,l,sizeof l);
            memcpy(tr,r,sizeof r);
            rep(i,2,n/2-1) l[i]=tl[i+1]; l[n/2]=tr[n/2];
            rep(i,2,n/2) r[i]=tr[i-1]; r[1]=tl[2];
            rep(i,1,n/2) printf("%d %d%s",l[i],r[i],i==n/2?"\n":" ");
        }
    }
    return 0;
}

PS.附带一份想当然的错误代码

#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
using namespace std;
typedef long long ll;
const int maxn  = 100;
bool vis[maxn][maxn];
bool match[maxn];
int n;
int main(){
    while(scanf("%d",&n)!=EOF){
        memset(vis,0,sizeof vis);
        rep(i,1,n) vis[i][i]=1;
        rep(i,1,n-1){
            memset(match,0,sizeof match);
            rep(j,1,n){
                int cnt=0;
                if(match[j]) continue;
                rep(k,1,n){
                    if(j==k||match[j]||match[k]||vis[j][k]||vis[k][j]) continue;
                    vis[j][k]=vis[k][j]=1;
                    match[j]=1;match[k]=1;cnt++;
                    if(cnt==n/2) printf("%d %d\n",j,k);
                    else printf("%d %d ",j,k);
                }
            }
        }
    }
    return 0;
}

推荐阅读