sgu 109 Magic of David Copperfield II

题意:略。

奇数的话,只要留下中心。只要2轮,先将除中心的奇数编号去掉。再将偶数编号去掉。行动奇数距离。

偶数的话逐层去,先去最外层,去掉与1,1的曼哈顿距离为偶数且在最外层的,再去掉曼哈顿距离为奇数且在最外层的。类推。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
using namespace std;
const double EPS=1e-8;
typedef long long lon;
const lon SZ=150,INF=0x7FFFFFFF;
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int vst[SZ][SZ];

void dfs(int x,int y,int src,int n)
{
    int srcx=x;
    if(x==n/2)
    {
        if(src==1)cout<<" "<<((x-1)*n+y-1);
        else cout<<" "<<((x-1)*n+y)<<" "<<(x*n+y-1);
        return;
    }
    int d=0,cnt=src;
    if(!(cnt&1))
    {
        cout<<" "<<((x-1)*n+y);
        vst[x][y]=srcx;
    }
    for(;;)
    {
        if(x==y&&x==srcx)return;
        int nx=x+dx[d],ny=y+dy[d];
        //cout<<endl;
        //cout<<nx<<" "<<ny<<" "<<d<<endl;
        if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&(vst[nx][ny]==0||vst[nx][ny]==srcx))
        {
            x=nx,y=ny;
            ++cnt;
            if(!(cnt&1))
            {
                cout<<" "<<((x-1)*n+y);
                vst[nx][ny]=srcx;
            }
        }
        else
        {
            ++d;
        }
    }
}

int main()
{
    //cout<<ceil(-10.3)<<endl;
    std::ios::sync_with_stdio(0);
    //freopen("d:\\1.txt","r",stdin);
    int n;
    cin>>n;
    if(n>=2&&n&1)
    {
        cout<<n;
        for(int i=1;i<=n*n;++i)if((i&1)&&(i!=(n*n/2+1)))cout<<" "<<i;
        cout<<endl;
        cout<<n+2;
        for(int i=1;i<=n*n;++i)if(!(i&1))cout<<" "<<i;
        cout<<endl;
    }
    else if(!(n&1))
    {
        for(int i=0;i<n;++i)
        {
            cout<<n+1+2*i;
            dfs(i/2+1,i/2+2,!(i&1),n);
            cout<<endl;
        }
    }
    return 0;
}

 

posted @ 2018-10-08 20:16  degvx  阅读(135)  评论(0编辑  收藏  举报