回溯算法 k皇后问题 java实现

package p;

import java.util.Stack;

public class Main {
	final static int k = 8;		//k:皇后数,棋盘长、宽
	static Stack<Position> s;
	static int b[][];			
	static int answer=0;		//答案数
	public static void paintb(){
		for(int i=0;i<k;i++){
			for(int j=0;j<k;j++){
				System.out.print(b[i][j]+" ");
			}
			System.out.println();
		}
	}
	public static class Position{
		int x;
		int y;
		public Position(int x,int y) {
			this.x=x;
			this.y=y;
		}
		public String toString() {
			return("("+x+","+y+")");
		}
	}
	public static int modk(int x,int y,int initial){
		//此函数用以遍历皇后的对角线方格,将该方格的算子+1,如果出界,则将算子加在皇后本身
		if(x+y>=k){
			return initial;
		}
		else if(x+y<0){
			return initial;
		}
		return x+y;
	}
	public static void placeQueen(int x,int y){//放置一个皇后,设定其可攻击的域
		for(int i=0;i<k;i++){
			b[x][i]+=1;
			b[i][y]+=1;
			b[modk(x,i,x)][modk(y,i,y)]+=1;
			b[modk(x,i,x)][modk(y,-i,y)]+=1;
			b[modk(x,-i,x)][modk(y,i,y)]+=1;
			b[modk(x,-i,x)][modk(y,-i,y)]+=1;
		}
	}
	public static void replaceQueen(int x,int y){//重置一个皇后,撤销上个函数的效果
		for(int i=0;i<k;i++){
			b[x][i]-=1;
			b[i][y]-=1;
			b[modk(x,i,x)][modk(y,i,y)]-=1;
			b[modk(x,i,x)][modk(y,-i,y)]-=1;
			b[modk(x,-i,x)][modk(y,i,y)]-=1;
			b[modk(x,-i,x)][modk(y,-i,y)]-=1;
		}
	}
	public static void findQueen(int num,int row){//找第num个皇后,row为该皇后所在的行
		if(num>k){
			answer++;
			System.out.println("Solusion"+answer+" : ");
				for(Position p:s){
					System.out.print(p);
				}
				System.out.println();
				for(int i=0;i<k;i++){
					for(int j=0;j<k;j++){
						boolean queen=false;
						for(Position p:s){
							if(p.x==i&&p.y==j){
								queen=true;
							}
						}
						if(queen){
							System.out.print("x ");
						}
						else{
							System.out.print("o ");
						}
					}
					System.out.println();
				}
			System.out.println();
		}
		else{
			for(int i=row;i<k;i++){
				for(int j=0;j<k;j++){
					if(b[i][j]==0){
						placeQueen(i,j);
						s.add(new Position(i,j));
						findQueen(num+1,i);
						s.pop();
						replaceQueen(i,j);
					}
				}
			}
		}
	}
	public static void main(String[] args) {
		s = new Stack();
		b= new int[k][k];
		for(int i=0;i<k;i++){
			for(int j=0;j<k;j++){
				b[i][j]=0;
			}
		}
		findQueen(1,0);
		System.out.println(answer+" in total.");
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值