首页 > 编程知识 正文

八皇后问题解法图,八皇后问题数学解法

时间:2023-05-04 07:47:19 阅读:44374 作者:4896

八皇后也是个经典算法题目了。我听说过,没见过。

在国际象棋中,皇后可以在棋盘上攻击纵横斜八个方向的敌人。 于是,我们思考了这八个皇后同时放在棋盘上,皇后之间不能冲突的算法。挺有意思的(是的,实际上宫斗比较好吧。 )

3358 www.Sina.com/https://www.Luo gu.org/problem new/show/p 1219

主题说明这只是棋盘放置方式的一个解。 请编写一个程序,找出所有方格都放在的解。 用以上的顺序方法输出这些。 解按词典顺序排列。 请输出前三个解。 最后一行是解的总数。

输入形式: 1个数字n(6=n=13 )表示控制柜为nn的大小。

输出格式:前三行是前三个解,每个解的两个数字之间用空格分隔。 第四行只有一个数字表示解的总数。

输入示例: 6输出示例: 24613536214415634我刚拿到这个主题,我大脑中的暴力因子非常活跃——二维排列保存整个棋盘的状态,开始一行一行的深度优先搜索。

这个问题用到了题目来自洛谷试炼场深度优先搜索——八皇后,这里先用超暴力超时算法(汗)。

超时int sum=0; int map[100][100],ans[100]; //位置检查boolcheckpos(intx,int y,int n ) { for } inti=1; i=n; I ) if(map[I][y]==1)返回假; for(intj=1; j=n; j ) if(ABS(I-x )==ABS(j-y ) map[i][j]==1)返回假; }返回真; }语音队列(introw,int n ) if (rown ) sum; if(sum=3) for ) intI=1; i=n; I ) coutans[i] '; coutendl; }返回; }for(intcol=1; col=n; col(if ) check pos (row,col,n ) ) { map[row][col]=1; //皇后ans [ row ]=要放入Col的队列(row 1,n ); //查找下一列的地图[row][col]=0; //恢复回溯} }上述算法的结果是预期的,但最后两个样本在2/8,87点TLE下降。 毕竟,这种做法是搜索与回溯

让我们开始探索其他有效的算法。 仔细想想。 我必须保存整个棋盘吗?暴力上又加暴力结果肯定是超时,太暴力了!

算法的思路很清楚,其实和上面提到的超时算法差不多,通过搜索和回溯,当然这是开始实现的。

升级版! //DFS八皇后# include iostream # include cstdio # includecstringusingnamespacestd; int sum=0; //接下来是行—列—双对角线int a[100]、b[100]、c[100]、d[100]; //dfs和回溯语音队列(inti,int n ) if (in ) ) sum; if(sum=3(//前三行for ) intk=1; k=n; k ) couta[k] '; coutendl; }返回; (else ) for ) intj=1; j=n; j () if (! b[j]! c[i j]! d[I-jn](//其他皇后为a[i]=j; //i行j列中放置皇后b的b[j]=1; //纵列占领c[i j]=1; d[i-j n]=1; //对角线占领queen(I1,n ); //dfs b[j]=0; c[i j]=0; d[i-j n]=0; //恢复回溯} }//for} }int main (() ) {int n; cinn; 队列(1,n ); coutsum return 0; }这样解决问题后,这就是有名的八皇后吧。

只要用一个一维数组存下每一行皇后所在的列号,同时用辅助数组标识出该皇后所占领的列号和对角线不就行了。

是沿着可行的路径逐步向下探索。 有一天,当你发现自己走到了无路可走的死胡同时,跳出当前的操作,回到上一步,探索其他可行的路径。 这样一点一点地搜索,直到到达终点或搜索所有可行的路径,搜索操作才结束

去吧。 祝你一路平安,桥梁坚固,隧道也明亮。

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