问题说明n 皇后问题研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。上的照片是8皇后问题的一种解法。
给出整数n,返回所有不同n皇后问题的解决方案。
每种解法都包含明确的n皇后问题棋子放置方法,在该方案中“q”和“.”分别表示皇后和空位。
样本:
输入: 4
输出: [
['.Q…',//解法1]
“…Q”、
“Q…”
“…q .”是,
[…q.',//解法2]
“Q…”
“…Q”、
“. q…”
]
: 4皇后问题有两种不同的解法。
解开想法
代码代码思路行配置。 在决定一行中的那个皇后应该放在哪个列中时,需要判断当前列是否合法。 如果合法,请将皇后安置在当前位置,并递归追溯。 每一行充满皇后时,就会产生一种解法,将所有解法收集起来并返回。
判断为合法:“q”当前所处的位置和其他“q”已经所处的位置不能在同一列。 另外,不能在同一45度的斜线或135度的斜线上。 这里,是否在同一斜线上,可以通过当前放置‘q’的位置和放置其他‘q’的位置的横坐标的差和纵坐标的差的绝对值是否相等来判断
class解决方案{ publiclistliststringsolvenqueens (intn ) ) char[] ) CHS=newchar[n][n]; for(intI=0; in; I ) for(intj=0; jn; j({CHS[I][j]='.'; } listliststringres=new ArrayList (; 后退跟踪(CHS,0,n,res ); 返回RES; } publicvoidbacktracing (char [ ] [ ] CHS,int row,int n,ListListString res )//如果每行都填满皇后,则一种解法if(row==n ) (//一行一行地排列,在决定一行中的那个皇后应该排列成哪个列的时候,需要现在的列是否合法。 //如果合法,将皇后置于当前位置,递归地追溯。 for (国际=0; colchs[0].length; col () if ) isvalid(CHS、row、col ) ) { chs[row][col]='Q '; //递归后退跟踪(CHS,row 1,n,res ); chs[row][col]='.'; } } publicliststringchstolist (char [ ] [ ] CHS ) { ListString list=new ArrayList ); for(intI=0; ichs.length; I ) list.add(newstring ) CHS[I] ); }返回列表; (//判断为正当)现在“q”所在的位置和已经“q”所在的其他位置不能在同一列。 另外,不能在同一45度的斜线或135度的斜线上。 //此处是否在同一斜线上,可以通过当前放置‘q’位置与其他放置‘q’的位置的横坐标之差和纵坐标之差的绝对值是否相等来判断。 publicbooleanisvalid (char [ ] [ ] CHS,int x,int y ) {for ) intI=0; i=x; I ) for(intj=0; jchs[0].length; j ) if ) CHS [ I ] [ j ]==' q ' (j==y|| math.ABS (x-I )==math.ABS(y-j ) ) {返回假; } }返回真; }