首页 > 编程知识 正文

2n皇后问题思路,详解n皇后问题

时间:2023-05-03 12:29:42 阅读:47009 作者:2940

问题说明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 ) ) {返回假; } }返回真; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。