棋盘覆盖实验报告

合集下载

棋盘覆盖问题心得体会

棋盘覆盖问题心得体会

棋盘覆盖问题心得体会棋盘覆盖问题是一道经典的数学问题,它以其独特的解题思路和复杂的难度吸引了许多数学爱好者的关注。

通过对这个问题的深入研究和探索,我从中获得了很多宝贵的启示和体会。

首先,棋盘覆盖问题展示了数学问题的多样性和创造性。

在这个问题中,我们需要将一个2的幂次方大小的棋盘完全覆盖住,每个棋盘单元格由一个特殊形状的骨牌覆盖。

然而,骨牌的形状并不是规则的,而是由四个大小相等但形状不同的L形骨牌组合而成。

我发现,在解决这个问题的过程中,有多种不同的创造性方法。

这些方法包括使用递归、分治法和动态规划等,每个方法都有其独特的优点和应用场景。

通过尝试这些不同的方法,我能够更好地理解和掌握问题的本质,并培养了自己的创造性思维能力。

其次,棋盘覆盖问题也教会了我如何进行数学建模和问题抽象。

在解决这个问题时,首先我们需要将问题转化为数学模型。

我们将棋盘看作是一个方形矩阵,每个单元格的状态可以是空白、骨牌1、骨牌2、骨牌3或骨牌4中的一个。

然后,我们需要确定一种适合的数据结构来表示这个模型,并且需要定义合适的操作来改变模型的状态。

我在解决棋盘覆盖问题的过程中学到了如何进行模型的建立和抽象,以及如何使用合适的数据结构和操作来表示和处理问题。

这些技能对于解决其他数学问题和计算机科学问题也是非常有用的。

最重要的是,棋盘覆盖问题让我认识到数学问题的解决过程是一个探索和思考的过程。

在解决这个问题时,我需要不断地尝试和查找不同的解决方法,然后进行比较和评估,最终选择最合适的方法。

这个过程中会遇到各种挑战和困难,需要耐心和毅力来克服。

然而,正是这个过程让我学会了如何思考和解决数学问题,提高了我在其他领域的问题求解能力。

我发现,在解决数学问题时,关键是保持积极的态度和正确的方法。

只要有足够的努力和耐心,每个人都可以找到自己的解决方法。

总的来说,通过研究和探索棋盘覆盖问题,我对数学问题的本质和解决方法有了更深入的理解和认识。

我学到了如何运用不同的思维方法和技能来解决问题,提高了自己的数学建模和问题求解能力。

棋盘覆盖问题的求解

棋盘覆盖问题的求解

棋盘覆盖问题的求解棋盘覆盖问题是一个经典的数学问题,它引发了人们对于数学中的逻辑思维和问题解决能力的思考。

在这篇文章中,我将为大家详细介绍棋盘覆盖问题的求解方法,并希望能够帮助中学生和他们的父母更好地理解和应用这一问题。

棋盘覆盖问题是指如何用特殊形状的骨牌将一个2^n × 2^n的棋盘完全覆盖的问题。

其中,骨牌的形状分为4种,分别为L型、反L型、凸型和凹型。

在求解这个问题时,我们需要遵循以下几个步骤。

首先,我们需要将给定的棋盘划分为四个相等的小棋盘。

这样,我们就可以将问题分解为四个子问题,分别是将四个小棋盘覆盖完整。

接下来,我们就可以通过递归的方式来解决每个子问题。

在解决子问题时,我们需要根据骨牌的形状来选择放置的位置。

以L型骨牌为例,我们可以将其放置在左上角、左下角或者右上角。

通过不同的放置位置,我们可以将子问题进一步分解为更小的子问题。

同样地,我们可以使用相同的方法来解决反L型、凸型和凹型骨牌。

在每个子问题中,我们需要注意两个关键点。

首先,我们需要保证每个小棋盘上的骨牌能够完全覆盖。

这就要求我们在放置骨牌时,需要选择合适的位置和方向。

其次,我们需要保证四个小棋盘的边缘能够对齐。

这样,才能保证最终的结果是一个完整的棋盘。

通过不断地递归求解子问题,我们最终可以将整个棋盘完全覆盖。

这个过程中,我们需要注意边界条件的处理,以及递归函数的设计。

同时,我们还可以通过剪枝等优化方法来提高算法的效率。

棋盘覆盖问题的求解方法不仅仅是一个数学问题,更是一个思维训练的过程。

通过解决这个问题,我们可以培养自己的逻辑思维能力、问题解决能力和创新思维。

同时,这个问题也具有一定的实用性,可以用于解决一些实际问题,如图像处理、计算机视觉等领域。

总结一下,棋盘覆盖问题是一个经典的数学问题,通过将棋盘划分为四个小棋盘,我们可以通过递归的方式来解决每个子问题。

在解决子问题时,我们需要选择合适的骨牌形状和放置位置,同时保证边缘对齐和完全覆盖。

实验二 动态规划算法棋盘覆盖

实验二  动态规划算法棋盘覆盖

实验二动态规划算法棋盘覆盖最长公共子序列问题一、实验目的 :1、熟悉最长公共子序列问题的算法;2、初步掌握动态规划算法。

二、实验内容若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。

例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。

给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。

给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。

三、实验步骤1、代码// ZXL_1.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "iostream.h"#include <cstring>//#include "make2DArray.h"void make2DArray(int** &x , int rows , int cols ){//创建行指针x = new int*[rows] ;//为每一行分配空间for( int i= 0 ; i<rows; i++ ){x[i] = new int[cols] ;}}void LCS(int i,int j,char *x,int **b){if(i == 0||j == 0)return;if(b[i][j] == 1){LCS(i-1,j-1,x,b);cout<<x[i];}else if(b[i][j] == 2)LCS(i-1,j,x,b);else LCS(i,j-1,x,b);}void LCSLength(int m,int n,char *x,char *y,char **c,int **b ) {int i,j;for(i = 1;i <= m;i++) c[i][0] = 0;for(i = 1;i <= n;i++) c[0][i]=0;for(i = 1;i <= m;i++)for(j = 1;j <= n;j++){if(x[i] == y[j]){c[i][j] = c[i-1][j-1] + 1;b[i][j] = 1;}else if(c[i-1][j] >= c[i][-1]){c[i][j] = c[i-1][j] + 1;b[i][j] = 2;}else{c[i][j] = c[i][j-1] + 1;b[i][j] = 3;}LCS(i,j,x,b);}}int main(int argc, char* argv[]){char x[]="1abcdefghijk",y[]="0abcdjki";int **b,**c;int m=strlen(x);int n=strlen(y);make2DArray(c,m+1,n+1);make2DArray(b,m+1,n+1);for(int i=1;i<=m;i++)for(int j=i;j<=m;j++)c[i][j]=0;LCSLength(m,n,x,y,c,b);LCS(m,n,x,b);cout<<endl;delete b;delete c;return 0;}2、结果执行成功.3、结果分析。

分治策略算法棋盘覆盖问题

分治策略算法棋盘覆盖问题

在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖。

四个L型骨牌如下图1图1棋盘中的特殊方格如图2图2实现的基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不在某一个子棋盘中,将这个子棋盘中的相应的位置设为骨牌号,将这个无特殊方格的了棋盘转换为有特殊方格的子棋盘,然后再递归处理这个子棋盘。

原理如图3所示。

图3将棋盘保存在一个二维数组中。

骨牌号从1开始,特殊方格为0,如果是一个4 * 4的棋盘,特殊方格为(2,2),那么程序的输出为2 23 32 1 1 34 1 0 54 45 5相同数字的为同一骨牌。

下面是棋盘覆盖问题的c++语言实现。

#include <iostream>#include<iomanip>using namespace std;#define BOARD_SIZE 4int board[BOARD_SIZE][BOARD_SIZE];// c1, r1: 棋盘左上角的行号和列号// c2, r2: 特殊方格的行号和列号// size = 2 ^ kvoid chessboard(int r1, int c1, int r2, int c2, int size){if(1 == size) return;int half_size;static int domino_num = 1;int d = domino_num++;half_size = size / 2;if(r2 < r1 + half_size && c2 < c1 + half_size) //特殊方格在左上角子棋盘chessboard(r1, c1, r2, c2, half_size);else // 不在此棋盘,将此棋盘右下角设为相应的骨牌号{ board[r1 + half_size - 1][c1 + half_size - 1] = d;chessboard(r1, c1, r1 + half_size - 1, c1 + half_size - 1, half_size);}if(r2 < r1 + half_size && c2 >= c1 + half_size) //特殊方格在右上角子棋盘chessboard(r1, c1 + half_size, r2, c2, half_size);else // 不在此棋盘,将此棋盘左下角设为相应的骨牌号{ board[r1 + half_size - 1][c1 + half_size] = d;chessboard(r1, c1 + half_size, r1 + half_size - 1, c1 + half_size, half_size);}if(r2 >= r1 + half_size && c2 < c1 + half_size) //特殊方格在左下角子棋盘chessboard(r1 + half_size, c1, r2, c2, half_size);else // 不在此棋盘,将此棋盘右上角设为相应的骨牌号{ board[r1 + half_size][c1 + half_size - 1] = d;chessboard(r1 + half_size, c1, r1 + half_size, c1 + half_size - 1, half_size);}if(r2 >= r1 + half_size && c2 >= c1 + half_size) //特殊方格在左上角子棋盘chessboard(r1 + half_size, c1 + half_size, r2, c2, half_size);else // 不在此棋盘,将此棋盘左上角设为相应的骨牌号{ board[r1 + half_size][c1 + half_size] = d;chessboard(r1 + half_size, c1 + half_size, r1 + half_size, c1 + half_size, half_size);}}void main(){ int i, j;board[2][2] = 0;chessboard(0, 0, 2, 2, BOARD_SIZE);for(i = 0; i < BOARD_SIZE; i++){ for(j = 0; j < BOARD_SIZE; j++)cout<<setw(4)<<board[i][j];cout<<"\n";}}。

分治法棋盘覆盖问题算法原理

分治法棋盘覆盖问题算法原理

分治法棋盘覆盖问题算法原理
分治法棋盘覆盖问题算法是一种基于分治策略的算法,用于解决棋盘覆盖问题。

该算法的基本原理是将一个复杂的问题分解为若干个较小的子问题,然后分别求解这些子问题,最后将子问题的解合并为原问题的解。

在棋盘覆盖问题中,给定一个n×n的棋盘,要求用最少的1×2骨牌覆盖整个棋盘。

分治法棋盘覆盖问题算法通过将棋盘不断划分,将问题规模逐渐减小,最终将问题转化为若干个1×1的棋盘覆盖问题,从而使得问题得以解决。

具体来说,该算法首先将棋盘划分为四个相等的子棋盘,然后判断哪个子棋盘中包含特殊方格。

对于不包含特殊方格的子棋盘,用L型骨牌覆盖其会合处,将其转化为特殊棋盘。

然后递归地使用这种划分策略,直至将棋盘分割为1×1的子棋盘。

通过这种分治策略,算法可以将问题规模不断减小,直到每个子问题都能够被直接解决。

最终,所有子问题的解将被合并为原问题的解。

这种算法不仅具有高效性,而且能够将复杂的问题分解为若干个简单的子问题,使得问题的解决更加容易。

棋盘覆盖问题(分治思想)

棋盘覆盖问题(分治思想)

棋盘覆盖问题(分治思想)在⼀个2^k * 2^k个⽅格组成的棋盘中,有⼀个⽅格与其它的不同,若使⽤以下四种L型⾻牌覆盖除这个特殊⽅格的其它⽅格,如何覆盖。

四个L型⾻牌如下图:棋盘中的特殊⽅格如图:实现的基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的⼦棋盘,特殊⽅格⼀定在其中的⼀个⼦棋盘中,如果特殊⽅格在某⼀个⼦棋盘中,继续递归处理这个⼦棋盘,直到这个⼦棋盘中只有⼀个⽅格为⽌如果特殊⽅格不在某⼀个⼦棋盘中,将这个⼦棋盘中的相应的位置设为⾻牌号,将这个⽆特殊⽅格的了棋盘转换为有特殊⽅格的⼦棋盘,然后再递归处理这个⼦棋盘。

以上原理如图所⽰:棋盘覆盖程序如下:#include <iostream>using namespace std;int tile = 1;//全局变量⾻牌编号int Board[4][4];//棋盘void ChessBoard(int tr,int tc,int dr,int dc,int size);int main(){for(int i=0; i<4; i++){for(int j=0; j<4; j++){Board[i][j] = 0;}}ChessBoard(0,0,2,3,4);for(int i=0; i<4; i++){for(int j=0; j<4; j++){cout<<Board[i][j]<<"";}cout<<endl;}}/*** tr : 棋盘左上⾓的⾏号,tc棋盘左上⾓的列号* dr : 特殊⽅格左上⾓的⾏号,dc特殊⽅格左上⾓的列号* size :size = 2^k 棋盘规格为2^k*2^k*/void ChessBoard(int tr,int tc,int dr,int dc,int size){if(size == 1){return;}int t = tile++;//L型⾻牌编号int s = size/2;//分割棋盘//覆盖左上⾓⼦棋盘if(dr<tr+s && dc<tc+s)//特殊⽅格在此棋盘中{ChessBoard(tr,tc,dr,dc,s);}else//特殊⽅格不在此棋盘中{//⽤编号为t的⾻牌覆盖右下⾓Board[tr+s-1][tc+s-1] = t;//覆盖其余⽅格ChessBoard(tr,tc,tr+s-1,tc+s-1,s);}//覆盖右上⾓⼦棋盘if(dr<tr+s && dc>=tc+s)//特殊⽅格在此棋盘中 {ChessBoard(tr,tc+s,dr,dc,s);}else//特殊⽅格不在此棋盘中{//⽤编号为t的⾻牌覆盖左下⾓Board[tr+s-1][tc+s] = t;//覆盖其余⽅格ChessBoard(tr,tc+s,tr+s-1,tc+s,s);}//覆盖左下⾓⼦棋盘if(dr>=tr+s && dc<tc+s)//特殊⽅格在此棋盘中 {ChessBoard(tr+s,tc,dr,dc,s);}else//特殊⽅格不在此棋盘中{//⽤编号为t的⾻牌覆盖右上⾓Board[tr+s][tc+s-1] = t;//覆盖其余⽅格ChessBoard(tr+s,tc,tr+s,tc+s-1,s);}//覆盖右下⾓⼦棋盘if(dr>=tr+s && dc>=tc+s)//特殊⽅格在此棋盘中 {ChessBoard(tr+s,tc+s,dr,dc,s);}else//特殊⽅格不在此棋盘中{//⽤编号为t的⾻牌覆盖左上⾓Board[tr+s][tc+s] = t;//覆盖其余⽅格ChessBoard(tr+s,tc+s,tr+s,tc+s,s);}}程序运⾏结果如下:。

3算法设计实验1棋盘覆盖


棋盘
骨牌
ห้องสมุดไป่ตู้
输入、输出
实验目标
• 要求 1.至少运行3组不同的输入数据; 2.用分治法求解. • 实验报告应包括 1. 题目; 2. 解决思想、方法阐述; 3. 实验结果截图; 4. 算法分析(时间复杂度推导); 5. 小结和心得; 6. 源程序清单. • 实验报告提交电子版,于第六周上课前发送至
算法分析与设计 实验 1
分治法
题目:棋盘覆盖
• 问题描述:在一个2kx2k的棋盘中,有一个特殊方 格,要求用L型骨牌覆盖满除特殊方格外的所有其 他方格,且骨牌不得重叠.(骨牌可以旋转放置) • 输入:k值、特殊方格坐标 • 输出:骨牌放法.其中用0表示特殊方格,同一张 骨牌所占方格用同一个数字表示,不同骨牌用不 同数字.

棋盘覆盖

实验一:棋盘覆盖(递归与分治策略)一、实验目的与要求1、明确棋盘覆盖的概念2、明确递归与分治策略的设计思路。

3、利用递归与分治策略解决棋盘覆盖问题。

二、实验题:问题描述:递归与分治策略算法,用4种不同形态的L型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

输入数据由程序运行后的界面中的编辑框中输入游戏规模,特殊方格的位置。

将覆盖的结果在窗口中显示出来。

三、实验代码#include<iostream>#include<stdio.h>using namespace std;#define SIZE 16 //宏定义棋盘的大小int board[SIZE][SIZE] ; //全局变量int chessboard(int tr,int tc, int dr, int dc, int size);int main(){int tr = 0,tc = 0;int dr,dc;cout<<"特殊棋子的列号:dr = ";cin>>dr;cout<<"特殊棋子的行号:dc = ";cin>>dc;chessboard(tr,tc,dr,dc,SIZE);for(int i = 0;i < SIZE; ++ i){for(int j = 0;j < SIZE;++ j){//cout<<board[i][j]<<" ";printf("%-2d ",board[i][j]); //控制字符输出格式}cout<<endl;}}int chessboard(int tr,int tc, int dr, int dc, int size){if(size == 1) return 0;int s,t;static int tile = 0; //将tile申请为静态变量,以便储存tile随时改变的值t = tile ++;s = size / 2;if(dr < tr+ s && dc < tc +s){chessboard(tr,tc,dr,dc,s);}else{board[tr + s - 1][tc + s - 1] = t;chessboard(tr,tc,tr + s -1,tc + s - 1,s);}//覆盖左上角if(dr < tr+ s && dc >= tc +s){chessboard(tr,tc + s,dr,dc,s);}else{board[tr + s - 1][tc + s] = t;chessboard(tr,tc + s,tr + s -1,tc + s,s);}//覆盖棋盘右上角if(dr >= tr+ s && dc < tc +s){chessboard(tr + s,tc,dr,dc,s);}else{board[tr + s][tc + s - 1] = t;chessboard(tr + s,tc,tr + s,tc + s - 1,s);}//覆盖棋盘左下角if(dr >= tr+ s && dc >= tc +s){chessboard(tr + s,tc + s,dr,dc,s);}else{board[tr + s][tc + s] = t;chessboard(tr + s,tc + s,tr + s,tc + s,s);}//覆盖棋盘右下角return 1;}四、实验结果。

算法分析与设计实验1:棋盘覆盖

方法:分治法
• 3.[实验说明,包括输入、输出、结果截图]
输入:交互式输入棋盘的长度,特殊棋盘的坐标
输出:棋盘由数字组成,采用不同数字代表不同坐标的L形骨牌,特殊棋盘上的数字为0
运行例1:
运行例2:
•4.[算法复杂性计算过程]
可以知道算法的递推公式为:
当k=0时,T(k)=O(1);当k>0时,T(k)=4T(k-1)+O(1);
chess(tr+half,tc,tr+half,tc+half-1,half)
if pr>=tr+half and pc>=tc+half:
chess(tr+half,tc+half,pr,pc,half)
else:
table[tr+half][tc+half]=count
chess(tr+half,tc+half,tr+half,tc+half,half)
chess(tr,tc,pr,pc,half)
else:
table[tr+half-1][tc+half-1]=count
chess(tr,tc,tr+half-1,tc+half-1,half)
if pr<tr+half and pc>=tc+half:
chess(tr,tc+half,pr,pc,half)
1.至少运行3组不同的输入数据;
2.用分治法求解
实验实现
• 1.[编程语言]:实验用Python完成算法设计和程序设计并调试通过。
• 2.[解题思想、方法]

计算机算法实验报告

计算机算法设计与分析实验报告专业:软件工程(过程控制)学号:541213470163姓名:邹锦程指导老师:孙海燕实验一:棋盘覆盖(递归与分治策略)一、实验目的与要求1、明确棋盘覆盖的概念2、明确递归与分治策略的设计思路。

3、利用递归与分治策略解决棋盘覆盖问题。

二、实验题:问题描述:递归与分治策略算法,用4种不同形态的L型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

输入数据由程序运行后的界面中的编辑框中输入游戏规模,特殊方格的位置。

将覆盖的结果在窗口中显示出来。

三、实验代码#include<iostream.h>int tile=1;int Board[100][100];void ChessBoard(int tr,int tc,int dr,int dc,int size){if(size==1)return;int t=tile++;//L型骨牌号int s=size/2;//分割棋盘//覆盖左上角子棋盘if(dr<tr+s&&dc<tc+s)//特殊方格在此棋盘中ChessBoard(tr,tc,dr,dc,s);else{//此棋盘中无特殊方格//用t号L型骨牌覆盖右下角Board[tr+s-1][tc+s-1]=t;//覆盖其余方格ChessBoard(tr,tc,tr+s-1,tc+s-1,s);}//覆盖右上角子棋盘if(dr<tr+s&&dc>=tc+s)//特殊方格在此棋盘中ChessBoard(tr,tc+s,dr,dc,s);else{//此棋盘中无特殊方格//用t号L型骨牌覆盖左下角Board[tr+s-1][tc+s]=t;//覆盖其余方格ChessBoard(tr,tc+s,tr+s-1,tc+s,s);}//覆盖左下角子棋盘if(dr>=tr+s&&dc<tc+s)//特殊方格在此棋盘中ChessBoard(tr+s,tc,dr,dc,s);else{//用t号L型骨牌覆盖右上角Board[tr+s][tc+s-1]=t;//覆盖其余方格ChessBoard(tr+s,tc,tr+s,tc+s-1,s);}//覆盖右下角子棋盘if(dr>=tr+s&&dc>=tc+s)//特殊方格在此棋盘中ChessBoard(tr+s,tc+s,dr,dc,s);else{//用t号L型骨牌覆盖左上角Board[tr+s][tc+s]=t;//覆盖其余方格ChessBoard(tr+s,tc+s,tr+s,tc+s,s);}}void main(){int size;cout<<"输入棋盘的size(大小必须是2的n次幂):";cin>>size;int index_x,index_y;cout<<"输入特殊方格位置的坐标:";cin>>index_x>>index_y;ChessBoard(0,0,index_x,index_y,size);for(int i=0;i<size;i++){for(int j=0;j<size;j++)cout<<Board[i][j]<<"\t";cout<<endl;}}四、实验结果输入棋盘的size(大小必须是2的n次幂):8输入特殊方格位置的坐标:333 34 4 8 8 9 9 3 2 2 4 8 7 7 95 26 6 10 107 11 5 5 6 0 1 10 11 11 13 13 14 1 1 18 19 19 13 12 14 14 18 18 17 19 15 12 12 16 20 17 17 21 15 15 16 16 20 20 21 21 Press any key to continue实验二:矩阵连乘问题(动态规划)一、实验目的与要求1、明确矩阵连乘的概念。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法设计与分析实验报告
专 业:
学 号:
姓 名:
指导老师:
实验一:棋盘覆盖
一、实验目的与要求
1、理解算法的概念
2、实现棋盘化以及棋盘覆盖
二、实验题

1、编程任务:设计棋盘覆盖的一个简单算法
2、输入数据:输入特殊方格的行号和特殊方格的列号以及棋盘的大小
3、结果输出:将计算结果输出显示棋盘
解:
1,实现解释。
本程序采用java实现的,要输入期盘覆盖的行数,然后随机出现一个黑色的特殊方格,
然后用其他的颜色覆盖。
出现初始画面:如图:然后点击操作:

出现对话框:然后输入棋盘覆盖的行数:
输入行数,如:8,然后点击确定:运行如下
实验源码如下:
package two;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.util.*;
/**
*
* @author 郑金光
*/
public class FenZi {
public static void main(String args[])
{
new MyChessBoard();
}

}
class MyChessBoard extends JFrame implements ActionListener {
int dimen; //棋盘规模
int x_pos; //特殊点横坐标
int y_pos; //特殊点竖坐标
Container p;

public MyChessBoard() {
super();
x_pos = 0;
y_pos = 0;
dimen = 0;
setTitle("棋盘覆盖");
setBackground(Color.YELLOW);
setBounds(300,150,510,480);
centreOnScreen();
//setResizable(false);
p = getContentPane();

JMenuBar jmb = new JMenuBar();
JMenu jm = new JMenu("操作");
JMenuItem jitem1 = new JMenuItem("开始");
JMenuItem jitem2 = new JMenuItem("退出");
jm.add(jitem1);
jm.add(jitem2);
jmb.add(jm);
setJMenuBar(jmb);

jitem1.addActionListener(this);
jitem2.addActionListener(this);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setVisible(true);
}

public void centreOnScreen() { //使窗体显示在屏幕中央
Dimension displaySize = getToolkit().getScreenSize();
Dimension winSize = getSize();
int x = (displaySize.width - winSize.width) / 2;
int y = (displaySize.height - winSize.height) / 2;
if(x < 0) {
x = 0;
}
if(y < 0) {
y = 0;
}
setLocation(x, y);
}

public void actionPerformed(ActionEvent e) {
if(e.getActionCommand()=="退出") {
System.exit(0);
}
else if(e.getActionCommand()=="开始") {
//在此输入方阵大小
JOptionPane jop = new JOptionPane();
jop.setVisible(true);
do{
dimen = Integer.parseInt(JOptionPane.showInputDialog(p,"输入方阵的行数:
","输入棋盘的行数:(提示是2的指数)",JOptionPane.INFORMATION_MESSAGE));
if(dimen/2==0)
dimen=Integer.parseInt(JOptionPane.showInputDialog(p,"请你重新输入:","
输入棋盘的行数:(提示是2的指数)",JOptionPane.INFORMATION_MESSAGE));
}while(dimen/2==0);
System.out.println(dimen);

x_pos = (int)(dimen*Math.random()); //随机生成特殊点位置
y_pos = (int)(dimen*Math.random());
p.setLayout(new GridLayout(dimen, dimen));
System.out.println(x_pos+","+y_pos);
ChessBoard cb = new ChessBoard(dimen);
cb.coverMethod(0, 0, x_pos, y_pos, dimen);
int[][] board = cb.getBoard();
JButton btn;
for(int i=0; ifor(int j=0; jif(board[i][j] == 0) {
btn = new JButton("@");
btn.setFont(new Font("", Font.BOLD, 24));
btn.setForeground(Color.red);
btn.setBackground(new Color(0, 0, 0));
} else {
btn = new JButton();
btn.setBackground(new Color((board[i][j]*134)%255, //生成
0-255的值,并与board[i][j]建立关系
(board[i][j]*145)%255,
(board[i][j]*178)%255));
}
p.add(btn);
}
}

}
System.out.println("bbbb");
this.setVisible(true);
}
}

class ChessBoard {
int [][] board;
int tile;
ChessBoard(int k) {
board = new int [k][k]; //k*k的数组,保存最终结果
tile = 0;
}
void coverMethod(int tr,int tc,int dr,int dc,int size) {
//棋盘覆盖
if(size == 1) return;
int t = ++tile;
int s = size/2;
if(drcoverMethod(tr,tc,dr,dc,s);
} else {
board[tr+s-1][tc+s-1] = t;
coverMethod(tr,tc,tr+s-1,tc+s-1,s);
}

if(dr=tc+s) {
coverMethod(tr,tc+s,dr,dc,s);
} else {
board[tr+s-1][tc+s] = t;
coverMethod(tr,tc+s,tr+s-1,tc+s,s);
}

if(dr>=tr+s && dccoverMethod(tr+s,tc,dr,dc,s);
} else {
board[tr+s][tc+s-1] = t;
coverMethod(tr+s,tc,tr+s,tc+s-1,s);
}

if(dr>=tr+s && dc>=tc+s) {
coverMethod(tr+s,tc+s,dr,dc,s);
} else {
board[tr+s][tc+s] = t;
coverMethod(tr+s,tc+s,tr+s,tc+s,s);
}
}

public int[][] getBoard() {
//返回覆盖结果
return board;
}
}

相关文档
最新文档