zoukankan      html  css  js  c++  java
  • 考试整理

    残缺棋盘问题

    这个需要采取分治的思想

    就是使劲的将棋盘分为等价的四份

    知道找到一个残块,然后递归放置直到整张棋盘

    Code:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<iomanip>
    #include<string>
    #include<algorithm>
    #include<cstdlib>
    #include<queue>
    #include<stack>
    using namespace std;
    inline int read() 
    {
        int X=0,w=1; 
        char c=getchar();
        while(c<'0'||c>'9')
        { 
            if (c=='-')
            {
                w=-1; 
            } 
            c=getchar();
        }
        while(c>='0'&&c<='9')
        {
            X=(X<<3)+(X<<1)+c-'0';
            c=getchar();
        } 
        return X*w;
    }
    int k,x,y,size=1;
    int board[1500][1500];
    inline int work(int a,int b,int size,int A,int B)//a->枚举的左上;b->枚举的右上;size->区域边长;A->残块的横;B->残块的纵。 
    {
        if(size<2)
            return 0;
        int s;
        s=size/2;
        if(A>=(a+s)&&B>=(b+s))
        {
            work(a+s,b+s,s,A,B);
            board[a+s-1][b+s-1]=1;
            board[a+s-1][b+s]=1;
            board[a+s][b+s-1]=1;
            work(a,b,s,a+s-1,b+s-1);
            work(a,b+s,s,a+s-1,b+s);
            work(a+s,b,s,a+s,b+s-1);
        }
        else if(A>=(a+s)&&B<(b+s))
        {
            work(a+s,b,s,A,B);
            board[a+s-1][b+s-1]=2;
            board[a+s-1][b+s]=2;
            board[a+s][b+s]=2;
            work(a,b,s,a+s-1,b+s-1);
            work(a,b+s,s,a+s-1,b+s);
            work(a+s,b+s,s,a+s,b+s);
        }
        else if(A<(a+s)&&B>=(b+s))
        {
            work(a,b+s,s,A,B);
            board[a+s-1][b+s-1]=3;
            board[a+s][b+s-1]=3;
            board[a+s][b+s]=3;
            work(a,b,s,a+s-1,b+s-1);
            work(a+s,b,s,a+s,b+s-1);
            work(a+s,b+s,s,a+s,b+s);
        }
        else if(A<(a+s)&&B<(b+s))
        {
            work(a,b,s,A,B);
            board[a+s-1][b+s]=4;
            board[a+s][b+s-1]=4;
            board[a+s][b+s]=4;
            work(a,b+s,s,a+s-1,b+s);
            work(a+s,b,s,a+s,b+s-1);
            work(a+s,b+s,s,a+s,b+s);
        }
    }
    int main()
    {
        freopen("chessboard.in","r",stdin);
        freopen("chessboard.out","w",stdout);
        k=read(),x=read(),y=read();
        board[x][y]=7;
        for(int i=1;i<=k;i++)
            size=size*2;
        work(1,1,size,x,y);
        for(int i=1;i<=size;i++)
        {
            for(int j=1;j<=size;j++)
                printf("%d ",board[i][j]);
            printf("
    ");
        }
        return 0;
    }

    相对还是比较好(李姐的)

  • 相关阅读:
    第一阶段冲刺05
    生成器
    三元表达式 ,列表推导式 , 字典生成式
    装饰器
    闭包函数
    函数的定义和参数
    列表内置方法
    字符串的内置方法
    py_11_ 0731
    py_11_ 0730
  • 原文地址:https://www.cnblogs.com/gongcheng456/p/11523443.html
Copyright © 2011-2022 走看看