加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

棋盘覆盖

发布时间:2020-12-14 01:33:04 所属栏目:大数据 来源:网络整理
导读:棋盘覆盖 思路: 自己学个数组模拟一下数的乘除法即可,至于课本上的分治法求两个大数的积,如果用在这里有点大才小用,简单模拟即可。 下面的代码是求用多少块格子,递归覆盖棋盘的代码和用队列模拟的递归覆盖棋盘的代码。仅供参考 再说点,大数乘除法以后

棋盘覆盖


思路:
自己学个数组模拟一下数的乘除法即可,至于课本上的分治法求两个大数的积,如果用在这里有点大才小用,简单模拟即可。
下面的代码是求用多少块格子,递归覆盖棋盘的代码和用队列模拟的递归覆盖棋盘的代码。仅供参考
再说点,大数乘除法以后可能会经常用到,感兴趣的可以上网搜一下大数的C++模板,JAVA有个大数包,据说只要内存够,数就能存下,可以看一下。

//棋盘覆盖问题
//自己模拟数的乘除法
//NYOJ 45 
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;

int a[105];

int main(){
	int T;
	scanf("%d",&T);
	int num;
	int _count = 1;
	int jin_wei;
	int tmp;
	while(T--){
		a[0] = 1;
		_count = 1;
		scanf("%d",&num);
		for(int i=1; i<=num; i++){
			jin_wei = 0;
			for(int j=0; j<_count; j++){
				tmp = a[j]*4+jin_wei;
				a[j] = tmp%10;
				jin_wei = tmp/10;
			}
			if(jin_wei)
				a[_count++] = jin_wei;
		}
		//模拟除法 
		a[0] -= 1;
		tmp = 0;
		for(int i=_count-1; i>=0; i--){
			tmp = (10*tmp+a[i]);
			a[i] = tmp/3;
			tmp = tmp%3;
		}
		int i;
		if(a[_count-1]==0)
			i = _count-2;
		else
			i = _count-1; 
		for( ; i>=0; i--)
			printf("%d",a[i]);
		cout << endl;
	}
	
	return 0;
} 


//方法一:用递归的分治 
/*
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <iostream>

using namespace std;

typedef long long int ll;

int Count = 1;
int board[1050][1050];

void print(int size){
	
	for(int i=0; i<size; i++){
		for(int j=0; j<size; j++)
			printf("%-3d",board[i][j]);
		printf("n");
	} 
}

void chess_board(int posx,int posy,int x,int y,int size){
	
	if( size==1 )
		return ;
	size /= 2;
	int num = Count++;
	//左上角
	if( posx+size>x && posy+size>y )
		chess_board(posx,posy,x,y,size);
	else{
		board[posx+size-1][posy+size-1] = num;
		chess_board(posx,posx+size-1,posy+size-1,size);
	}
	
	//右上角
	if( y>=posy+size && x<posx+size )
		chess_board(posx,posy+size,size);
	else{
		board[posx+size-1][posy+size] = num;
		chess_board(posx,size);
	} 
	
	//左下角
	if( x>=posx+size && y<posy+size )
		chess_board(posx+size,size);
	else{
		board[posx+size][posy+size-1] = num;
		chess_board(posx+size,posx+size,size);
	} 
	
	//右下角
	if( x>=posx+size && y>=posy+size )
		chess_board(posx+size,size);
	else{
		board[posx+size][posy+size] = num;
		chess_board(posx+size,size);
	}
}

int main(){
	
	int E;
	scanf("%d",&E);
	int x,y;
	scanf("%d %d",&x,&y);
	board[x][y] = -1;
	chess_board(0,E);
	print(E);
	return 0;
	
}
*/

/*
//用队列实现的分治
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;

int Count = 1;
int board[1050][1050];

struct Node{
	int posx;
	int posy;
	int x;
	int y;
	int size;
	Node(){
		posx = posy = x = y = size = 0;
	}
	Node(int a1,int a2,int a3,int a4,int a5){
		posx = a1;
		posy = a2;
		x = a3;
		y = a4;
		size = a5;
	}
};
queue<Node> Q;

void print(int size){
	
	for(int i=0; i<size; i++){
		for(int j=0; j<size; j++)
			printf("%-5d",board[i][j]);
		printf("n");
	} 
}

int main(){
	
	int E;
	scanf("%d",&y);
	board[x][y] = -1;
	Node node,tmp;
	node.posx = 0;
	node.posy = 0;
	node.x = x;
	node.y = y;
	node.size = E;
	Q.push(node);
	while( !Q.empty() ){
		tmp = Q.front();
		Q.pop();
		if( tmp.size==1 )
			continue;
		int size = tmp.size/2;
		int posx = tmp.posx;
		int posy = tmp.posy;
		int x = tmp.x;
		int y = tmp.y;
		int num = Count++;
		//左上角 
		if( posx+size>x && posy+size>y ){
			Node node(posx,size);
			Q.push(node);
		}
		else{
			board[posx+size-1][posy+size-1] = num;
			Node node(posx,size);
			Q.push(node);
		}
		
		//右上角
		if( y>=posy+size && x<posx+size ){
			Node node(posx,size);
			Q.push(node);
		} 
		else{
			board[posx+size-1][posy+size] = num;
			Node node(posx,size);
			Q.push(node);
		}
	
		//左下角
		if( x>=posx+size && y<posy+size ){
			Node node(posx+size,size);
			Q.push(node);
		}
		else{
			board[posx+size][posy+size-1] = num;
			Node node(posx+size,size);
			Q.push(node);
		} 
	
		//右下角
		if( x>=posx+size && y>=posy+size ){
			Node node(posx+size,size);
			Q.push(node);
		}
		else{
			board[posx+size][posy+size] = num;
			Node node(posx+size,size);
			Q.push(node);
		}
	}
	print(E);	
	return 0;
} 

*/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读