1. 证明问题有解:
2.分治法模型:
3. 算法分析:
如果一个算法的复杂度上界=问题的计算下界,则称该算法为渐近意义下的最优算法(即不考虑常数)
4.伪码:
5.物理应用:
- 棋盘覆盖问题可用于解决病灶覆盖治疗
6.代码:
import java.util.Scanner;
public class 棋盘覆盖 {
static int maxn=1000;
static int tile=1,board[][]=new int[maxn][maxn];
//变量解释在图片上
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;
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;
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;
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;
chessBoard(tr+s, tc+s, tr+s, tc+s, s);
}
}
public static void main(String arg[]) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int size=(int) Math.pow(2, n);
int dr = sc.nextInt();
int dc=sc.nextInt();
board[dr][dc]=0;
chessBoard(0, 0, dr, dc, size);
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++) {
System.out.print(board[i][j]+" ");
}
System.out.println();
}
}
}