java 基础 | 八皇后(一维数组,且只输出了一种答案)

public class EightQueens{
	public static void main(String[] args){
		int[] array = new int[8];//每一个表示该行第几列 如 array[2] = 8 表示第2+1个皇后,放在第2+1行,第8列
		//第一个皇后在第一行,第二个皇后在第二行,第三个皇后在第三行。。。。以此类推
		//只需要确定在第x行的第几列
		T t = new T();
		for(int i = 0;i < array.length ;i++){//默认初始都摆放在1这个位置。
				array[i] = 1;
		}
		t.findWay(array,0,1);//第一个皇后放第1个位置

		System.out.println("最终的摆放方法:");
		for(int i = 0;i < array.length ;i++){
				System.out.print(array[i] + "\t"); 
		}
	
		//
	}
}

/*摸索过程 --- 不用看了-------检验第i个皇后与其他皇后都不冲突的方法。

class T{
	public boolean findWay(int[]array, n){//放置第n个皇后
		//递归结束条件:第i个皇后与其他所有皇后均不冲突。
		// array ->  {array[0],array[1],array[2]...} //这样写就表示不在同一行上了
		// array[0] 、 array[1]  ...  array[7] 互不相等  // 不在同一列上
		// 任意array[m] = n  array[j] = k,  k-n != j-m , // 不在同一斜杠上
		int queennum = array.length;

		for(int i = 0 ; i < n-1 ; i++){
			//i前面的皇后,举例:n=4,即 array 3 ,那么就要看array 0 1 2
			if(array[i] != array[n] && array[i] - array[n] == i - n){
				return false;
			}
					
		}
		for(int i = n + 1 ; i < array.length ; i++){
		//i后面的皇后,举例:n=4,即 array 3 ,那么就要看array 4 5 6 7
			if(array[i] != array[n] && array[i] - array[n] == i - n){
				return false;
			}
		}

	}
}
*/
class T{
	public boolean judge(int[]array,int n,int j){//判断第n个皇后位置是否与前n-1个皇后位置冲突.  第一个皇后放在1
		if(n == 0){
			array[n] = j;
			return true;
		}else{
			for(int i = 0 ; i < n ; i++){
			//i前面的皇后,举例:n=4,即 array 3 ,那么就要看array 0 1 2
				if(array[i] == array[n] || Math.abs(array[i] - array[n]) == Math.abs(i - n)){
					System.out.println("冲突啦 "); 

					System.out.print("————————冲突错误为:第"+ (i + 1) +"个皇后和第"+ (n + 1) + "个皇后冲突。当前array[" + i + "] = " + array[i] + ", array[" + n + "] = " + array[n] + "\n");
					return false; 
				}
			}
			System.out.println("无冲突了 ,当前到第"+(n+1)+"个皇后,位置在"+array[n]); 
			System.out.println("________________________" ); 
			return true;
		}


	}



	public boolean findWay(int[]array, int index,int j){//index第index+1个皇后,j为第一个皇后放的位置。
			if(index == 8){
				return true;
			}else{
				for(int i = 0 ;i<100; i++){//不需要回溯时,初始位置都为1,一共需要判断8次,i < 9 - array[index]  即i<8
					//需要回溯时,上一个皇后位置为array[index-1],需要判断次数为,8-array[index-1]次,i < 8-array[index-1]
					//这里就让他一直循环好了,给出退出条件就行。
					if(judge(array,index,j)){//与前index-1个皇后不冲突,返回true
						boolean result = findWay(array,index + 1,j);
						return true;
					}else if(array[index] == 8){//如果,该皇后到了放至第八个,仍然与前面皇后冲突,需要回溯到上一个皇后,改变上一个皇后位置
						if(array[index-1] < 8){
							//保证不会超过棋盘,小于8时可继续尝试
							array[index-1] = array[index-1] + 1;
							array[index] = 1;

							if(findWay(array,index-1,j)){
									return true;
							}							
						}else if(array[index-1]==8){//需要回溯两个皇后时,可能还会有回溯三个、四个这种,但是这边两个就够了
							array[index-2] = array[index-2] + 1;
							array[index] = 1;
							array[index-1] = 1;						
							if(array[index-2]<8){
								if(findWay(array,index-2,j)){
								return true;
								}
							}
						}
					}else{//初始皇后都放在1,每次冲突与前面皇后冲突位置就加1,如果array[index] == 8,仍然冲突,则要回溯。
						System.out.println("i = " + i + " " + "; 八皇后冲突的  array[" + index +  "] =" + array[index] + "\t"); 
						array[index] = array[index]+ 1;
						System.out.println("i = " + i + " " + "; 调整后的   array[" + index +  "] =" + array[index] + "\t"); 
					}	
				}
				return false;		
			}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值