八皇后问题的C#解答

解答|问题

改编自V星[视窗王子]应答程序,如下:<br>
<br>
using System;<br>
class Queen{<br>
    const int SIZE = 8;//皇后数<br>
    public static void Main()<br>
    {<br>
        int[] Queen = new int [SIZE];//每行皇后的位置<br>
        int y,x,i,j,d,t=0;<br>
        y = 0;<br>
        Queen[0] = -1;<br>
        while( true )<br>
        {<br>
            for (x=Queen[y]+1; x<SIZE; x++)<br>
            {<br>
                for (i=0;i<y;i++)<br>
                {<br>
                    j = Queen[i];<br>
                    d = y-i;<br>
                    //检查新皇后是否与以前的皇后能相互攻击<br>
                    if ((j==x)||(j==x-d)||(j==x+d))<br>
                        break;<br>
                }<br>
                if (i>=y)<br>
                    break;//不攻击<br>
            }<br>
            if (x == SIZE) //没有合适的位置<br>
            {<br>
                if (0==y)<br>
                {<br>
                    //回朔到了第一行<br>
                    Console.WriteLine("Done");<br>
                    break; //结束<br>
                }<br>
                //回朔<br>
                Queen[y]=-1;<br>
                y--;<br>
            }<br>
            else<br>
            {<br>
                Queen[y]=x;//确定皇后的位置<br>
                y++;//下一个皇后<br>
                if (y<SIZE)<br>
                    Queen[y]=-1;<br>
                else<br>
                {<br>
                    //所有的皇后都排完了,输出<br>
                    Console.WriteLine("\n" + ++t +':');<br>
                    for(i=0;i<SIZE;i++)<br>
                    {<br>
                        for (j=0;j<SIZE;j++)<br>
                            if(Queen[i] == j)<br>
                                Console.Write('Q');<br>
                            else<br>
                                Console.Write('.');<br>
                        Console.WriteLine();<br>
                    }<br>
                    y = SIZE -1;//回朔<br>
                }<br>
            }<br>
        }<br>
    }<br>
}<br>
八皇后有解92个。<br>
另:我认为foreach和for循环在意义上是不同的,在这里应该用for.<br>
望指正,此致。<br>
重粒子@Y2K0928<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
送交者: 视窗王子  列出所有还未回答的带星问题   于 9月 28, 2000 09:16:  <br>
主题:多谢重粒子兄  答复本贴<br>
阅读相关的帖子 <br>
<br>
--------------------------------------------------------------------------------<br>
<br>
回答: 给视窗王子:八皇后问题C#版 由 重粒子 于 9月 27, 2000 22:32:<br>
<br>
非常感谢您的注解以及优化,不过比较了一下结果,好像我俩的结果是一致的。:-)<br>
另外,关于打印的那部分,如果这样优化:<br>
Console.Write(Queen[i]==j ? 'Q':'.');<br>
似乎可以更简洁一些,粒子兄以为呢?<br>
关于foreach和for, 的确,无论从字面上还是在文档中都让人感到for似乎比foreach更有确定性。然而,foreach毕竟是也一种遍历,关键是遍历的可重复性和法则,即,每次遍历的结果是可预计的和相同的。另外,我们可以通过定制Enumerator来决定foreach的遍历行为,使得“无法遍历”或“不可预计的”变成“可遍历”且“可预计的”,如同C++中重载[]算符使得链表“变成”了数组。<br>
<br>
对于一些基本数据结构的遍历,比如数组,foreach还是和for一致的,不过粒子兄提醒的好,对任何事千万不要想当然,它除了会把你引入歧途外不会给你带来任何好处。<br>
<br>
目前我正在和MS的C# Developer打交道,事实上现在MS中有部分产品的部分代码用上了C# (不知是正式的还是做试验)。很希望和粒子兄以及各位大大小小的虾兄弟姐妹们一起玩玩这新鲜玩意儿。<br>

时间: 2024-08-30 09:10:48

八皇后问题的C#解答的相关文章

c语言-八皇后问题在线等解答

问题描述 八皇后问题在线等解答 #include #include int place(int k,int x[]) { int i=0; for(i=1;i if(fabs(k-i)==fabs(x[i]-x[k])||x[i]==x[k])return 0; return 1; } void backstrack(int t,int n,int x[],int *sum) { int i; if(t>n)(*sum)++; else for(i=1;i<=n;i++) { x[t]=i;

UVa 639:Don&#039;t Get Rooked, 类八皇后问题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=108&page=show_problem&problem=580 题目类型: 暴力, 回溯法 题目: In chess, the rook is a piece that can move any number of squares vertically or horizontally. In this p

UVa 167:The Sultan&#039;s Successors, 八皇后问题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=108&page=show_problem&problem=103 题目类型: 回溯 原题: The Sultan of Nubia has no children, so she has decided that the country will be split into up to k separate

基于Delphi的八皇后问题动态实现

摘要 对于八皇后问题的实现,如果结合动态的图形演示,则可以使算法的描述更形象.更生动,使教学能产生良好的效果. 关键词 八皇后问题 冲突 数据结构 线程类 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 下面用delphi6实现的八皇后问题的动态图形程序,能够演示全部的92组解.八皇后问题动态图形的实现,主要应解决以下

常用算法:C#八皇后问题

八皇后问题是一个古老而著名的问题,是回溯算法的典型应用.八皇后问题就是棋盘上的8个皇后不能在同一行.一列或一条斜线上,在8!=40320种排列中共有92种解决方案.代码如下: using System; using System.Collections.Generic; using System.Text;namespace ExQueen { class Queen { public void QueenArithmetic(int size){ int[] Queen = new int[s

python基于右递归解决八皇后问题的方法

  本文实例讲述了python基于右递归解决八皇后问题的方法.分享给大家供大家参考.具体分析如下: 凡是线性回溯都可以归结为右递归的形式,也即是二叉树,因此对于只要求一个解的问题,采用右递归实现的程序要比回溯法要优美的多. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 def Test(queen,n): '''这个就不用说了吧,就是检验第n(下标,0-7)行皇后的位置是否合理''' q=que

javascript递归回溯法解八皇后问题

  javascript递归回溯法解八皇后问题:           网上看到许多关于八皇后算法的文章,很少能看到使用javascript来实现的,今天就给大家使用javascript来解决下这个问题,有需要的小伙伴可以参考下. 下面给大家分享的是回溯法解八皇后, 带详细注解,这里就不多废话了. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

c语言-C++中的八皇后问题,编译通过了,但执行的时候为什么直接显示按任意键返回

问题描述 C++中的八皇后问题,编译通过了,但执行的时候为什么直接显示按任意键返回 #include//8*8的棋盘 #define max 8 int i,j; int e,s; char queen[max][max]; int main() { void fz(); void put(); void check(); void show(); void checkandput(); void checkagain(); for(i=0;i<max;i++) for(j=0;j<max;j

swift未解决八皇后的问题代码

问题描述 swift未解决八皇后的问题代码 首先提一下八皇后的问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 代码问题:用下面我自己的方法实现的八皇后,结果出现了无尽的循环.可能是思路还是哪里的不严谨?请教大伙帮忙改改!我已经尽力了... 注:代码可以直接粘贴复制进xcode的playground进行测试! class ChessBoard { var limit: Intvar queens = [Queen](