编程大作业(棋盘覆盖问题)
棋盘覆盖问题程序说明

棋盘覆盖问题
对一M*N棋盘,假设有外形完全一样的骨排.每一骨排可覆盖棋盘上两相邻的方格.若用一些骨排覆盖棋盘,使棋盘上所有格被盖,且不交叉,称完全覆盖,.8*8棋盘是否可以完全覆盖?
编程思想:将棋盘设为一个M*N数组,对数组中每个元素分别赋值0和1,并使每个元素与其周围元素的值不相等。
再将数组中对角元素赋给0,1以外的值。
统计数组中0元素与1元素的个数。
若相等,证明可以完全覆盖,不相等则不能完全覆盖。
本程序特点:棋盘的行数和列数可以是任意的。
只需输入行数和列数便可得到结论。
缺点:棋盘只能是缺少对角的,不能是缺少任意的几格。
棋盘覆盖问题..txt - 记事本

#include <iostream>using namespace std;#define SIZE 4int title = 1; //title表示L型骨牌的编号int board[SIZE][SIZE];void ChessBoard(int tr,int tc,int dr,int dc,int size);void ChessPrint();int main(int argc,char * argv[]){char again = 'Y';int dr,dc;while(again=='Y'||again=='y'){cout<<"输入特殊方格所在的行号dr和列号dc:";cin>>dr>>dc;ChessBoard(0,0,dr-1,dc-1,SIZE);cout<<"覆盖结果为:"<<endl;ChessPrint();cout<<"继续?(Y||y)";cin>>again;}return 0;}/*** 功能:棋盘覆盖* @param tr表示棋盘左上角行号* @param tc表示棋盘左上角列号* @param dr表示特殊棋盘的行号* @param dc表示特殊棋盘的列号* @param size = 2^k* 棋盘的规格为2^k * 2^k**/void ChessBoard(int tr,int tc,int dr,int dc,int size){if(1 == size) return;int t = title++; //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);第 1 页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 ChessPrint(){int i;int j;for(i = 0; i < SIZE; i++){for(j = 0; j < SIZE; j++){cout<<board[i][j]<<" ";}cout<<endl;}}第 2 页。
【IT专家】递归分治策略——Java之棋盘覆盖问题解决

递归分治策略——Java之棋盘覆盖问题解决2018/03/23 35 问题描述与分析:在一个2的k次方乘以2的k次方个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为一个特殊方格,且称该棋盘为一个特殊棋盘。
显然特殊方格在棋盘上出现的位置有4的k次方种情形。
因为对任何k =0,有4的k次方种不同的特殊棋盘。
如图(a)所示。
在棋盘覆盖问题中,要用4种不同形态的L型骨牌(b图所示)覆盖一个给定的特殊棋盘上除特殊方格以外所有方格,且任何2个L型骨牌不得重叠覆盖。
易知,在任何一个个2的k次方乘以2的k次方的棋盘覆盖中,用到的L型骨牌个数恰为(4的k次方-1)/3。
分治策略:当k 0时,将个2的k次方乘以2的k次方棋盘分割为4个2的(k-1)次方乘以2的(k-1)次方子棋盘。
特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘无特殊方格。
为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,这三个子棋盘上被L型骨牌覆盖的方格就成为该棋盘上的特殊方格,从而将原问题转化为4个较小规模的棋盘覆盖问题。
递归地使用这种分割,直至棋盘简化为1×1棋盘。
(示例图如下) 算法设计与实现:import java.util.Scanner;import java.math.*;public class ChessBoard { static int tile = 1; //表示L型骨牌的编号static int Board[][]; //表示棋盘,Board[0][0]是棋盘左上角方格。
/*声明:* 棋盘左上角方格的行号tr * 棋牌左上角方格的列号tc * 特殊方格所在的行号dr * 特殊方格所在的列号dc * size=2的k次方,棋盘规格为2的k次方乘以2的k次方static int tr,tc = 0; static int dr,dc,size; static double k; static 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; // 覆盖其余方。
棋盘覆盖问题c语言

// 覆盖本子棋盘中的其余方格
ChessBoard(tr,tc,tr+s-1,tc+s-1,s);
}
//覆盖右上角子棋盘
if(dr<tr+s&&dc>=tc+s)
// 特殊方格在此棋盘中
ChessBoard(tr,tc,dr,dc,s);
else
{//特此棋盘中无特殊方格 ,t号L型骨牌覆盖左下角
{//此棋盘中无特殊方格 ,t号L型骨牌覆盖左上角
board[tr+s][tc+s]=t;
// 覆盖本子棋盘中的其余方格
ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
}
}
int main()
{
int size,r,c,row,col;
printf("输入棋盘大小:\n");
scanf("%d",&size);//输入棋盘大小
{
for (c = 0; c < size; c++)
{
printf("%d ",board[r][c]);
}
printf("\n");
}
return 0;
}
运行效果:
实验报告成绩
老师
注:1)专业班级按打印课表中名称填写;2)课程名称按课表中名称填写,不能简写;
3)实验日期格式示例:)实验时间格式示例:“第三大节”5)实验情况包括任务(或题目)、解决方案(或者代码)、结果等;6)实验报告成绩按五级标准评分;精心搜集整理,只为你的需要
分治策略算法棋盘覆盖问题

在一个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";}}。
棋盘覆盖实验报告

int x_pos;//特殊点横坐标
int y_pos;//特殊点竖坐标
Container p;
public MyChessBoard() {
super();
x_pos = 0;
y_pos = 0;
dimen = 0;
setTitle("棋盘覆盖");
setBackground(Color.YELLOW);
y = 0;}setLocation(x, y);}public void actionPerformed(ActionEvent e) {
if(e.getActionCommand()=="退出") {
System.exit
(0);}else if(e.getActionCommand()=="开始") {
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);
/**** @authorxxxx
*/
public class FenZi {
public static void main(String args[]){new MyChessBoard();}}
class MyChessBoard extends JFrame implements ActionListener {
for(int j=0; j<board[i].length; j++) {
3算法设计实验1棋盘覆盖
棋盘
骨牌
ห้องสมุดไป่ตู้
输入、输出
实验目标
• 要求 1.至少运行3组不同的输入数据; 2.用分治法求解. • 实验报告应包括 1. 题目; 2. 解决思想、方法阐述; 3. 实验结果截图; 4. 算法分析(时间复杂度推导); 5. 小结和心得; 6. 源程序清单. • 实验报告提交电子版,于第六周上课前发送至
算法分析与设计 实验 1
分治法
题目:棋盘覆盖
• 问题描述:在一个2kx2k的棋盘中,有一个特殊方 格,要求用L型骨牌覆盖满除特殊方格外的所有其 他方格,且骨牌不得重叠.(骨牌可以旋转放置) • 输入:k值、特殊方格坐标 • 输出:骨牌放法.其中用0表示特殊方格,同一张 骨牌所占方格用同一个数字表示,不同骨牌用不 同数字.
棋盘覆盖实验报告
import java.util.*;
/**** @authorxxxx
*/
public class FenZi {
public static void main(String args[]){new MyChessBoard();}}
class MyChessBoard extends JFrame implements ActionListener {
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(dr<tr+s && dc<tc+s) {
coverMethod(tr,tc,dr,dc,s);
for(int j=0; j<board[i].length; j++) {
if(board[i][j] == 0) {
btn = new JButton("@");
btn.setFont(new Font("", Font.BOLD, 24));
btn.setForeground(Color.red);
}else {
board[tr+s-1][tc+s-1] = t;
coverMethod(tr,tc,tr+s-1,tc+s-1,s);}if(dr<tr+s && dc>=tc+s) {
C语言编程练习59:棋盘问题
C语⾔编程练习59:棋盘问题题⽬描述在⼀个给定形状的棋盘(形状可能是不规则的)上⾯摆放棋⼦,棋⼦没有区别。
要求摆放时任意的两个棋⼦不能放在棋盘中的同⼀⾏或者同⼀列,请编程求解对于给定形状和⼤⼩的棋盘,摆放k个棋⼦的所有可⾏的摆放⽅案C。
输⼊输⼊含有多组测试数据。
每组数据的第⼀⾏是两个正整数n和k,⽤⼀个空格隔开,表⽰了将在⼀个n*n的矩阵内描述棋盘,以及摆放棋⼦的数⽬。
(n<=8,k<=n)当n和k均为-1时表⽰输⼊结束。
随后的n⾏描述了棋盘的形状:每⾏有n个字符,其中 # 表⽰棋盘区域, . 表⽰空⽩区域(数据保证不出现多余的空⽩⾏或者空⽩列)。
输出对于每⼀组数据,给出⼀⾏输出,输出摆放的⽅案数⽬C(数据保证C<2^31)。
样例输⼊2 1#..#4 4...#..#..#..#...-1 -1样例输出21思路:从第⼀排开始摆,⼀排摆⼀个,标记摆的位置的列。
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;char s[9][9];int vis[50];int n,k;int ans;void dfs(int a,int b){if(b==0){ans++;return;}for(int i=a;i<n;i++){for(int j=0;j<n;j++){if(s[i][j]=='#'&&vis[j]==0){vis[j]=1;dfs(i+1,b-1);vis[j]=0;}else{continue;}}}}int main(){while(scanf("%d%d",&n,&k)!=EOF){if(n==-1&&k==-1){break;}for(int i=0;i<n;i++){scanf("%s",&s[i]);}memset(vis,0,sizeof(vis)); ans=0;dfs(0,k);printf("%d\n",ans);}}。
棋盘算法实验报告(3篇)
个人自我介绍简单大方
很抱歉,但我无法为您提供____字的自我介绍。
以下是一个简洁而大方的自我介绍示例,供您参考:
大家好,我叫[姓名]。
很高兴有机会向大家介绍一下自己。
我出生并长大在[所在地],是一个勤奋、积极向上的人。
在学业方面,我于[毕业时间]从[学校名称]获得了[学位/专业]学位。
在大学期间,我通过自我努力和课外学习,取得了良好的学术成绩,并参与了一些学生组织和社团活动。
这些经历不仅培养了我的团队合作和领导能力,也加强了我的沟通和组织能力。
在工作方面,我有[工作年限]年的相关工作经验。
我曾在[公司/组织名称]担任[职位],负责[工作职责]。
在这期间,我不断努力提升自己的专业知识和技能,以适应快速发展的工作环境。
我善于分析问题并找出解决方案,能够有效地与团队合作并承担责任,这些都为我赢得了同事和上级的认可。
除了工作,我也积极参与志愿者活动,希望能为社区和弱势群体做一点贡献。
我相信,通过奉献和关心他人,我们可以建立一个更加和谐和温暖的社会。
在个人生活中,我喜欢阅读、旅行和运动。
阅读扩展了我的视野,旅行让我能够体验不同的文化和风景,而运动则让我保持健康和积极的精神状态。
此外,我也很喜欢与家人和朋友相处,分享彼此的喜怒哀乐。
总的来说,我是一个热情、乐观、有责任心的人。
我相信勤奋和坚持可以取得成功,而真诚和善良可以赢得他人的信任和支持。
我希望能够在您的团队中发挥我的才能,并与大家一同成长和进步。
这就是我简单的自我介绍,谢谢大家!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
运行结果:
求解思路:
核心思路是使用分治算法递归解决棋盘覆盖问题。
棋盘覆盖问题要用4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
棋盘大小为2k,因此分治算法可以将棋盘分成4个等大的子棋盘。
特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。
我们可以用一个L型骨牌覆盖这3个较小的棋盘的汇合处,如下图所示,这3个子棋盘上的方格就成为该棋盘上的特殊方格,从而将原问题化为4个较小规模的棋盘覆盖问题。
递归的使用这种分割,直至棋盘简化为1x1棋盘,便可以完全覆盖棋盘。