八皇后问题的暴力解决

本解决办法不使用深奥的算法思想,有点暴力,仅供各位参考。

编程的思想是不断让计算机自己尝试解决八皇后的问题,直到得到了一个解决方案,所以每次运行程序时都可以得到一个八皇后的解决方案,但是每次得到的结果很可能不尽相同。

8*8的棋盘,首先从第一行开始下起,由计算机随机选择一个位置,位置选定后,将棋盘上与第一个皇后相冲突的位置全部标记为不可用。

然后是第二行,也是由计算机随机选择一个位置,当然如果选择到了已经不可用的位置就让计算机重新选择,直到选择到了一个符合规则的位置,选择好了后再将与第二个皇后相冲突的位置全部标记为不可用。

如是,进行第三行到第八行皇后的位置的选定。

显然,大多数情况下,在某一行会出现没有任何一个位置可以选择的情况,这说明此次布局失败了,这里我们就不回溯了,就让计算机从第一行重新下。

直到第八行也能放下皇后了,就将整个八皇后的布置情况输出。

经过测试,可以得到结果。这个算法是让计算机不停地随机地尝试,得到的结果也是随机的。

以下是该算法的java程序。

public class H6_20{
	public static void main(String[] args) 
	{
		int matrix[][]= new int[8][8];
		int ran = -1;
		while(true)
		{
//初始化mateix
			for(int i=0; i<8; ++i)
			{
				for(int j=0; j<8; ++j)
				{
					matrix[i][j] = 0;
				}
			}
//first row
		ran = (int)(Math.random()*8);
		matrix[0][ran] = 1;
		for(int i=0; i<8; ++i)
		{
			if(i!=ran)
			{
				matrix[0][i] = -1;
			}
		}
		for(int i=0; i<8; ++i)
		{
			if(i!=0)
			{
				matrix[i][ran] = -1;
			}
		}
		for(int i=1; i<8; ++i)
		{
			if( ran+i > 7)
			{
				break;
			}
			matrix[0+i][ran+i] = -1;
		}
		for(int i=1; i<8; ++i)
		{
			if( ran-i < 0 )
			{
				break;
			}
			matrix[0+i][ran-i] = -1;
		}
		dispaly(matrix);

//second row
		ran = (int)(Math.random()*8);
		while(matrix[1][ran]!=0)
		{
			ran = (int)(Math.random()*8);
		}
		matrix[1][ran] = 1;
		for(int i=0; i<8; ++i)
		{
			if(i!=ran)
			{
				matrix[1][i] = -1;
			}
		}
		for(int i=0; i<8; ++i)
		{
			if(i!=1)
			{
				matrix[i][ran] = -1;
			}
		}
		for(int i=1; i<7; ++i)
		{
			if( ran+i > 7 )
			{
				break;
			}
			matrix[1+i][ran+i] = -1;
		}
		for(int i=1; i<7; ++i)
		{
			if( ran-i < 0 )
			{
				break;
			}
			matrix[1+i][ran-i] = -1;
		}
		dispaly(matrix);
//third row
		if( (matrix[2][0]+matrix[2][1]+matrix[2][2]+matrix[2][4]+matrix[2][5]+matrix[2][6]+matrix[2][7])==-7 ) continue;
		ran = (int)(Math.random()*8);
		while(matrix[2][ran]!=0)
		{
			ran = (int)(Math.random()*8);
		}
		matrix[2][ran] = 1;
		for(int i=0; i<8; ++i)
		{
			if(i!=ran)
			{
				matrix[2][i] = -1;
			}
		}
		for(int i=0; i<8; ++i)
		{
			if(i!=2)
			{
				matrix[i][ran] = -1;
			}
		}
		for(int i=1; i<6; ++i)
		{
			if( ran+i > 7 )
			{
				break;
			}
			matrix[2+i][ran+i] = -1;
		}
		for(int i=1; i<6; ++i)
		{
			if( ran-i < 0 )
			{
				break;
			}
			matrix[2+i][ran-i] = -1;
		}
		dispaly(matrix);
//fourth row
		if( (matrix[3][0]+matrix[3][1]+matrix[3][2]+matrix[3][4]+matrix[3][5]+matrix[3][6]+matrix[3][7])==-7 ) continue;
		ran = (int)(Math.random()*8);
		while(matrix[3][ran]!=0)
		{
			ran = (int)(Math.random()*8);
		}
		matrix[3][ran] = 1;
		for(int i=0; i<8; ++i)
		{
			if(i!=ran)
			{
				matrix[3][i] = -1;
			}
		}
		for(int i=0; i<8; ++i)
		{
			if(i!=3)
			{
				matrix[i][ran] = -1;
			}
		}
		for(int i=1; i<5; ++i)
		{
			if( ran+i > 7 )
			{
				break;
			}
			matrix[3+i][ran+i] = -1;
		}
		for(int i=1; i<5; ++i)
		{
			if( ran-i < 0 )
			{
				break;
			}
			matrix[3+i][ran-i] = -1;
		}
		dispaly(matrix);
//fifth row
		if( (matrix[4][0]+matrix[4][1]+matrix[4][2]+matrix[4][4]+matrix[4][5]+matrix[4][6]+matrix[4][7])==-7 ) continue;
		ran = (int)(Math.random()*8);
		while(matrix[4][ran]!=0)
		{
			ran = (int)(Math.random()*8);
		}
		matrix[4][ran] = 1;
		for(int i=0; i<8; ++i)
		{
			if(i!=ran)
			{
				matrix[4][i] = -1;
			}
		}
		for(int i=0; i<8; ++i)
		{
			if(i!=4)
			{
				matrix[i][ran] = -1;
			}
		}
		for(int i=1; i<4; ++i)
		{
			if( ran+i > 7 )
			{
				break;
			}
			matrix[4+i][ran+i] = -1;
		}
		for(int i=1; i<4; ++i)
		{
			if( ran-i < 0 )
			{
				break;
			}
			matrix[4+i][ran-i] = -1;
		}
		dispaly(matrix);
//sixth row
		if( (matrix[5][0]+matrix[5][1]+matrix[5][2]+matrix[5][4]+matrix[5][5]+matrix[5][6]+matrix[5][7])==-7 ) continue;
		ran = (int)(Math.random()*8);
		while(matrix[5][ran]!=0)
		{
			ran = (int)(Math.random()*8);
		}
		matrix[5][ran] = 1;
		for(int i=0; i<8; ++i)
		{
			if(i!=ran)
			{
				matrix[5][i] = -1;
			}
		}
		for(int i=0; i<8; ++i)
		{
			if(i!=5)
			{
				matrix[i][ran] = -1;
			}
		}
		for(int i=1; i<3; ++i)
		{
			if( ran+i > 7 )
			{
				break;
			}
			matrix[5+i][ran+i] = -1;
		}
		for(int i=1; i<3; ++i)
		{
			if( ran-i < 0 )
			{
				break;
			}
			matrix[5+i][ran-i] = -1;
		}
		dispaly(matrix);
//seventh row
		if( (matrix[6][0]+matrix[6][1]+matrix[6][2]+matrix[6][4]+matrix[6][5]+matrix[6][6]+matrix[6][7])==-7 ) continue;
		ran = (int)(Math.random()*8);
		while(matrix[6][ran]!=0)
		{
			ran = (int)(Math.random()*8);
		}
		matrix[6][ran] = 1;
		for(int i=0; i<8; ++i)
		{
			if(i!=ran)
			{
				matrix[6][i] = -1;
			}
		}
		for(int i=0; i<8; ++i)
		{
			if(i!=6)
			{
				matrix[i][ran] = -1;
			}
		}
		for(int i=1; i<2; ++i)
		{
			if( ran+i > 7 )
			{
				break;
			}
			matrix[6+i][ran+i] = -1;
		}
		for(int i=1; i<2; ++i)
		{
			if( ran-i < 0 )
			{
				break;
			}
			matrix[6+i][ran-i] = -1;
		}

		dispaly(matrix);

//eightth row
		if( (matrix[7][0]+matrix[7][1]+matrix[7][2]+matrix[7][4]+matrix[7][5]+matrix[7][6]+matrix[7][7])==-7 ) continue;
		ran = (int)(Math.random()*8);
		while(matrix[7][ran]!=0)
		{
			ran = (int)(Math.random()*8);
		}
		matrix[7][ran] = 1;
		dispaly(matrix);
		break;
		}
//display queens
		System.out.print("\n");
		for(int i=0; i<8; ++i)
		{
			for(int j=0; j<8; ++j)
			{
				System.out.print("| ");
				if(matrix[i][j]==1)
				{
					System.out.print("Q");
				}
				else
				{
					System.out.print(" ");	
				}
			}
			System.out.print("|"+"\n");
		}

	}

//display function
	public static void dispaly(int[][] array)
	{
		System.out.print("\n");
		for(int i=0; i<8; ++i)
		{
			for(int j=0; j<8; ++j)
			{
				System.out.print("| ");
				System.out.printf("%2s" ,array[i][j]);
			}
			System.out.print("|"+"\n");
		}
	}
}

    原文作者:八皇后问题
    原文地址: https://blog.csdn.net/u014791046/article/details/37596779
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞