码迷,mamicode.com
首页 > 其他好文 > 详细

考试整理

时间:2019-10-27 16:52:16      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:info   技术   lse   inline   cstring   name   col   pac   return   

残缺棋盘问题

技术图片

 

 

技术图片

这个需要采取分治的思想

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

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

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("\n");
    }
    return 0;
}

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

考试整理

标签:info   技术   lse   inline   cstring   name   col   pac   return   

原文地址:https://www.cnblogs.com/gongcheng456/p/11523443.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!