八皇后问题:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
八皇后问题的串行
为实现八皇后问题,既每行每列放置一个皇后,而且每一条对角线和每一条反对角线上最多只能有一个皇后,主要需要解决放置冲突的问题。冲突主要包括行、列、两条对角线,具体情况如下:
(1)列:规定每一列放一个皇后,不会造成列上的冲突;
(2)行:当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I为下标的标记置为被占领状态;
(3)对角线:对角线有两个方向。在同一对角线上的所有点(设下标为(i,j)),要么(i+j)是常数,要么(i-j)是常数。因此,当第I个皇后占领了第J列后,要同时把以(i+j)、(i-j)为下标的标记置为被占领状态。
总结来说,假设棋盘上的两个皇后的坐标分别为(i1,j1)和(i2,j2),不允许(i1-i2)=(j1-j2)或者(i1+j1)=(i2+j2)的情况出现。
八皇后问题的并行
该算法是将八皇后问题的所有可能的解置于相应的棋盘上,主进程负责生成初始化的棋盘,并将该棋盘发送到某个空闲进程的从进程,由该从进程求出棋盘上满足初始化条件的所有的解。这里,假设主进程只初始化棋盘的前两列,即在棋盘上的前两列分别放上两个皇后,这样就可以产生8×8=64个棋盘。对于N皇后问题,算法与八皇后问题基本类似,只要在程序实现的时候将皇后数设为N,然后加入输入语句,就可以实现N皇后的求解。
同样,并行算法的基本条件是对同时放置在棋盘上的任意两个皇后(i1,j1)和(i2,j2),不允许(i1-i2)=(j1-j2)或者(i1+j1)=(i2+j2)的情况出现。