考试整理
Posted gongcheng456
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了考试整理相关的知识,希望对你有一定的参考价值。
残缺棋盘问题
这个需要采取分治的思想
就是使劲的将棋盘分为等价的四份
知道找到一个残块,然后递归放置直到整张棋盘
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; }
相对还是比较好(李姐的)
以上是关于考试整理的主要内容,如果未能解决你的问题,请参考以下文章