【算法】L型组件填图问题

  1.问题描述

B是一个n×n棋盘,n=2k,(k=1,2,3,)。用分治法设计一个算法,使得:用若干个L型条块可以覆盖住B的除一个特殊方格外的所有方格。其中,一个L型条块可以覆盖3个方格。且任意两个L型条块不能重叠覆盖棋盘。

    例如:如果n=2,则存在4个方格,其中,除一个方格外,其余3个方格可被一L型条块覆盖;当n=4时,则存在16个方格,其中,除一个方格外,其余15个方格被5L型条块覆盖。

2. 具体要求

输入一个正整数n,表示棋盘的大小是n*n的。输出一个被L型条块覆盖的n*n棋盘。该棋盘除一个方格外,其余各方格都被L型条块覆盖住。为区别出各个方格是被哪个L型条块所覆盖,每个L型条块用不同的数字或颜色、标记表示。

3. 测试数据

输入:8

输出:

 

4. 设计与实现的提示

2k×2k的棋盘可以划分成若干块,每块棋盘是原棋盘的子棋盘或者可以转化成原棋盘的子棋盘。

注意:特殊方格的位置是任意的。而且,L型条块是可以旋转放置的。为了区分出棋盘上的方格被不同的L型条块所覆盖,每个L型条块可以用不同的数字、颜色等来标记区分。

可以采用可视化界面用不同颜色来表示各L型条块,显示其覆盖棋盘的情况。输出有多种表示方式。

5、程序实现(java)

 1import java.io.*;
 2public class Ex3_1
 3{   
 4    static int k=10;
 5    public static void main(String[] args) throws Exception
 6    {
 7        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
 8        System.out.println("请输入n(n为:2,4,8,16):");
 9        String str=br.readLine();
10        int m=Integer.parseInt(str);
11        L(m,2);
12    }

13    public static void L(int m,int n)//n=2,4,8,16
14    {
15        int[][] nn=new int[m][m];
16        l(nn,0,m-1,0,m-1,n);
17        for(int i = 0;i < m;i++)
18        {
19            for(int j = 0;j < m;j++)
20            {
21                System.out.print(nn[i][j]+" ");
22            }

23            System.out.println();
24        }

25    }

26    public static void l(int[][] nn,int x0,int x1,int y0,int y1,int flag)
27    {
28        if((1 == flag)&&(x1>x0)&&(y1>y0))
29        {
30            l(nn,x0,(x1+x0)/2,y0,(y1+y0)/2,1);  //1
31            l(nn,x0,(x1+x0)/2,(y1+y0)/2+1,y1,4);//4
32            l(nn,(x1+x0)/2+1,x1,(y1+y0)/2+1,y1,1);//1
33            l(nn,(x1+x0)/2+1,x1,y0,(y1+y0)/2,2);//2
34            
35            nn[(x1+x0)/2][(y1+y0)/2+1= k;
36            nn[(x1+x0)/2+1][(y1+y0)/2+1= k;
37            nn[(x1+x0)/2+1][(y1+y0)/2= k;
38            k++;
39        }

40        if((2 == flag)&&(x1>x0)&&(y1>y0))
41        {
42            l(nn,x0,(x1+x0)/2,y0,(y1+y0)/2,3);  //3
43            l(nn,x0,(x1+x0)/2,(y1+y0)/2+1,y1,2);//2
44            l(nn,(x1+x0)/2+1,x1,(y1+y0)/2+1,y1,1);//1
45            l(nn,(x1+x0)/2+1,x1,y0,(y1+y0)/2,2);//2
46            
47            nn[(x1+x0)/2][(y1+y0)/2= k;
48            nn[(x1+x0)/2+1][(y1+y0)/2= k;
49            nn[(x1+x0)/2+1][(y1+y0)/2+1= k;
50            k++;
51        }

52        if((3 == flag)&&(x1>x0)&&(y1>y0))
53        {
54            l(nn,x0,(x1+x0)/2,y0,(y1+y0)/2,3);  //3
55            l(nn,x0,(x1+x0)/2,(y1+y0)/2+1,y1,4);//4
56            l(nn,(x1+x0)/2+1,x1,(y1+y0)/2+1,y1,3);//3
57            l(nn,(x1+x0)/2+1,x1,y0,(y1+y0)/2,2);;//2
58            
59            nn[(x1+x0)/2][(y1+y0)/2= k;
60            nn[(x1+x0)/2+1][(y1+y0)/2= k;
61            nn[(x1+x0)/2][(y1+y0)/2+1= k;
62            k++;
63    
64            
65        }

66        if((4 == flag)&&(x1>x0)&&(y1>y0))
67        {
68            l(nn,x0,(x1+x0)/2,y0,(y1+y0)/2,3);  //3
69            l(nn,x0,(x1+x0)/2,(y1+y0)/2+1,y1,4);//4
70            l(nn,(x1+x0)/2+1,x1,(y1+y0)/2+1,y1,1);//1
71            l(nn,(x1+x0)/2+1,x1,y0,(y1+y0)/2,4);//4
72            
73            nn[(x1+x0)/2][(y1+y0)/2= k;
74            nn[(x1+x0)/2][(y1+y0)/2+1= k;
75            nn[(x1+x0)/2+1][(y1+y0)/2+1= k;
76            k++;
77        }

78    }

79}
6、运行结果
运行结果

posted on 2009-04-11 19:10 intrl 阅读(1025) 评论(0)  编辑 收藏 引用 所属分类: 数据结构与算法

只有注册用户登录后才能发表评论。
<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

导航

统计

随笔分类(55)

随笔档案(34)

网址收藏

资源下载

随笔导航

搜索

最新评论

阅读排行榜

评论排行榜