实验一 分治与递归—棋盘覆蓋问题 java实现

 基本题二:棋盘覆蓋问题

一、实验目的与要求

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

   }

 

四、源代码

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<tr + s&&dc <tc + s){

    //特殊方格在此棋盘

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<tr + s&& dc >= 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 <tc + s)

    //特殊方格在此棋盘

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<board.length;i++){

for(int j=0;j<board.length;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实现》

点赞