第八章部分习题循环日程表

陷入思维定式里面了..以为总是在递归基里面解决问题

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int maxn=10000;
int board[maxn][maxn];
int k;
void copy(int sx1,int sx2,int sy1,int sy2,int dx1,int dx2,int dy1,int dy2,int m)
{
    int len=sx2-sx1+1;

    for(int i=0;i<len;i++)
        for(int j=0;j<len;j++) board[dx1+i][dy1+j]=m+board[sx1+i][sy1+j];
}

//左闭右闭区间
void solve(int x1,int x2,int y1,int y2,int k)
{
    if(x2==x1)
    {
        board[x1][y1]=1;
        return;
    }


    int mx=x1+(x2-x1)/2;
    int my=y1+(y2-y1)/2;
    int m=1<<(k-1);

    solve(x1,mx,y1,my,--k);
    copy(x1,mx,y1,my,mx+1,x2,my+1,y2,0);
    copy(x1,mx,y1,my,mx+1,x2,y1,my,m);
    copy(x1,mx,y1,my,x1,mx,my+1,y2,m);
}

void print_board()
{
    for(int i=0;i<(1<<k);i++) 
    {
        for(int j=0;j<(1<<k);j++) printf("%3d ",board[i][j]);
        printf("
");
    }
}

int main()
{
    memset(board,0,sizeof(board));
    cin>>k;

    solve(0,(1<<k)-1,0,(1<<k)-1,k);

    print_board();

    return 0;
}
Yosoro
原文地址:https://www.cnblogs.com/tclan126/p/7499488.html