本文主要是介绍棋盘覆盖_动态规划,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
public class 棋盘覆盖 {
static int board[][];
static int tile=1; //L型骨牌序号,根据填入的顺序给L型骨牌编号
/** tr:棋盘左上角方格的行号;tc:棋盘左上角方格的列号* dr:特殊方格的行号;dc:特殊方格的列号* size:棋盘的大小是size×size*/
static void ChessBoard(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)ChessBoard(tr,tc,dr,dc,s); //特殊方格在此棋盘中else{ //此棋盘无特殊方格board[tr+s-1][tc+s-1]=t; //用t号L型骨牌覆盖此子棋盘的右下角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; //用t号L型骨牌覆盖此子棋盘的左下角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; //用t号L型骨牌覆盖此棋盘的右上角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; //用t号L型骨牌覆盖此棋盘左上角ChessBoard(tr+s,tc+s,tr+s,tc+s,s);}
}public static void main(String[] args) {int k=3; //棋盘大小是2^k×2^kint size=(int)Math.pow(2, k);board=new int[size][size];ChessBoard(0,0,0,1,size);for(int i=0;i<size;i++){for(int j=0;j<size;j++){System.out.printf("%4d",board[i][j]);}System.out.println();}
}
}
这篇关于棋盘覆盖_动态规划的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!