1、switch语句
基本用法:
switch(expr){
case value1:
statements;
break;
…
case value2:
statements;
break;
default:
statements;
break;
}
在使用switch语句时有以下注意事项
①switch(expr)语句中,expr表达式的类型必须是与int类型兼容的基本类型(能自动转换为int类型包括byte,short,char和int型)
②在 case valueN子句中,valueN必须满足以下条件:
●valueN类型必须与int兼容
●valueN必须是常量
●各个case子句的valueN表达式的值不同
③在switch子句中最多只有一个default子句。如果没有default子句程序会直接退出switch语句。default子句可以位于switch语句的任何位置,通常都放到后面。
2、综合例子:八皇后问题
8*8的象棋上摆放8个皇后,使任意2个皇后都不在同一行、同一列、同一对角线上,问有多少种摆法?
location数组:皇后在棋盘上每行上的列的位置,location[i]=j,表示皇后占据了第i行第j列
colsOccupied数组:皇后在棋盘上占据的列。colsOccupied[j]=1,占据了第j列
cross1Occupied数组:皇后在棋盘上占据的正对角线。cross1Occupied[i-j+size-1]=1,表示皇后占据了某一条正对角线
cross2Occupied数组:皇后在棋盘上占据的反对角线。cross1Occupied[i+j]=1,表示皇后占据了某一条反对角线
package ReadingLamp;
public class Queen {
public final int size;// 棋盘大小和皇后个数
public int[] location;// 皇后占据的位置
public int[] colsOccupied;// 皇后占据的列
public int[] cross1Occupied;// 皇后占据的正对角线
public int[] cross2Occupied;// 皇后占据的反对角线
public static final int STATUS_OCCUPY = 1;// 占据状态,已占据
public static final int STATUS_OCCUPY_CANCEL = 0;// 未占据
public static int count;
// 构造方法,初始化变量
public Queen(int size) {
this.size = size;
location = new int[size];
colsOccupied = new int[size];
cross1Occupied = new int[2 * size];
cross2Occupied = new int[2 * size];
}
// 如果对应的同一列,同一正对角线,同一负对角线都没被占用则返回true,否则有任意一个被占用,则返回false
public boolean isOccupied(int i, int j) {
return (colsOccupied[j] == 1)
|| (cross1Occupied[i - j + size - 1] == 1)
|| (cross2Occupied[i + j] == 1);
}
public void setStatus(int i, int j, int flag) {
colsOccupied[j] = flag;
cross1Occupied[i - j + size - 1] = flag;
cross2Occupied[i + j] = flag;
}
public void printCount() {
System.out.println("符合八皇后要求的第" + count + "种方案 :");
for (int i = 0; i < size; i++) {
System.out.println("行:" + i + " 列:" + location[i]);
}
}
// 皇后在从第i行开始的摆放位置
public void place(int i) {
for (int j = 0; j < size; j++) {
// 首先判断(i,j)有没有被占用
if (!isOccupied(i, j)) {
location[i] = j;// 占用该位置
setStatus(i, j, STATUS_OCCUPY);// 列,正对角线,反对角线占据
if (i < size - 1) {
place(i + 1);
} else {
count++;
printCount();
}
setStatus(i, j, STATUS_OCCUPY_CANCEL);
}
}
}
public void start() {
place(0);
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
new Queen(8).start();
}
}