Java流程控制

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

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值