基本题二:棋盘覆盖问题

一、实验目的与要求

1、掌握棋盘覆盖问题的算法;

2、初步掌握分治算法

二、实验题:

    盘覆盖问题:在一个2k×2k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2L型骨牌不得重叠覆盖。

三、实验提示

voidchessBoard(inttr, inttc, intdr, int dc, int size)

   {

      if (size == 1) return;

      int t = tile++,  // L型骨牌号

        s = size/2;  // 分割棋盘

      // 覆盖左上角子棋盘

      if (dr

         // 特殊方格在此棋盘中

         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= 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

         // 特殊方格在此棋盘中

         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);}

   }

 

四、源代码

import java.io.*;

 

public class SF_ChessBoard {

 

 private int tile = 1;//L型骨牌号

privateint board[][];

 

publicSF_ChessBoard(int size)

 {

board = new int[size][size];

 }

public void SF_ChessBoard(inttr,inttc,intdr,intdc,int size ){

if(size == 1)

return;

else{

int t = tile++;//

int s = size/2;

   //覆盖左上角子棋盘

if(dr

    //特殊方格在此棋盘

SF_ChessBoard(tr,tc,dr,dc,s);

   }

   else{//此棋盘中无特殊方格

    //t号骨牌覆盖右下角

board[tr + s - 1][tc + s -1] = t;

    //覆盖其余方格

SF_ChessBoard(tr,tc,tr + s - 1,tc + s -1,s);

   }

 

   //覆盖右上角子棋盘

if(dr= tc + s)

    //特殊方格在此棋盘

SF_ChessBoard(tr,tc + s,dr,dc,s);

   else{//此棋盘中无特殊方格

    //t号骨牌覆盖坐下角

board[tr + s - 1][tc + s ] = t;

    //覆盖其余方格

SF_ChessBoard(tr,tc + s,tr + s - 1,tc + s ,s);

   }

 

   //覆盖左下角子棋盘

if(dr>= tr + s&&dc

    //特殊方格在此棋盘

SF_ChessBoard(tr + s,tc,dr,dc,s);

   else{//此棋盘中无特殊方格

    //t号骨牌覆盖右上角

board[tr + s][tc + s - 1] = t;

    //覆盖其余方格

SF_ChessBoard(tr + s,tc,tr + s,tc + s - 1,s);

   }

 

   //覆盖右下角

if(dr>= tr + s&&dc >= tc + s)

    //特殊方格在此棋盘中

SF_ChessBoard(tr + s,tc + s,dr,dc,s);

   else{//此棋盘中无特殊方格

    //t号骨牌覆盖左上角

board[tr + s][tc + s] = t;

    //覆盖其他方格

SF_ChessBoard(tr + s,tc + s,tr + s,tc + s,s);

   }

  }

 }

 

 //打印棋盘

public void printchess() {

  //System.out.println("棋盘被覆盖后:");

for(inti=0;i

for(int j=0;j

System.out.print("\t"+board[i][j]);

System.out.println();

  }

 }

 

 

 /**

  * @paramargs

  * @throws IOException

  */

public static void main(String[] args) {

  // TODO Auto-generated method stub

try{

int size;//棋盘规格

int a;//特殊方格行坐标

int b;//特殊方格列坐标

InputStreamReaderisr = new InputStreamReader(System.in);

BufferedReaderbr = new BufferedReader(isr);

System.out.println("输入棋盘规格:");

size = Integer.parseInt(br.readLine());

System.out.println("输入特殊方格行坐标x:");

   a = Integer.parseInt(br.readLine());

System.out.println("输入特殊方格列坐标y:");

   b = Integer.parseInt(br.readLine());

SF_ChessBoardcb = new SF_ChessBoard(size);

System.out.println("棋盘被覆盖前:");

cb.printchess();

cb.SF_ChessBoard(0,0,a,b,size);

System.out.println("棋盘被覆盖后:");

cb.printchess();

}catch(IOException e){

e.printStackTrace();

  }

 }

}

 

 

输入:8  1  1

结果:

 

实验一 分治与递归—棋盘覆盖问题 java实现_第1张图片