ZHANG H. 2019-10-30 18:15 采纳率: 100%
浏览 237
已采纳

这个算法的问题在哪里?

这是八皇后问题的算法,来源于一本书的习题的答案,源码是C++并且是一个函数,不是完整的程序,我把它改写成了Java,运行了一下,发现运行结果的每个方案的第一个元素只有(1,1),也就是第一个皇后的位置都是最左上角。代码中的主函数是我自己写的,并且包含“//”的注释都是我自己的理解,原来都是没有的。请各位大神看一下是算法本身的问题还是主函数调用的问题?

public class Test 
{
    /**
     * 算法思路:假设前i-1行的皇后已经安放成功,现在要在第i行的
     * 适当列安放皇后,使得它与前i-1行安放的皇后在行方向、列方向
     * 和斜线方向都不冲突。为此,试探第i行的所有8个位置(列),
     * 如果某一列能够安放皇后,就可以递归到第i+1行继续寻找下一行
     * 皇后可安放的位置。为了记录各行皇后安放的位置,设置一个
     * 一维数组g[8],在g[i]中记录了该行皇后安放在第几列。
     */
    public static void Queen(int[] g,int i)
    {
        int j,k,conflict;//j是列,k是行,conflict表示位置是否冲突,1为真,0为假
        if(i==8)//单个方案寻找完毕,输出之
        {
            for(int m=0;m<8;m++)
                System.out.print("("+(m+1)+","+(g[m]+1)+") ");
            System.out.println(";");
            System.out.println();
            return;
        }
        else
        {
            for(j=0;j<8;j++)
            {
                conflict=0;
                //对于每一列,从第1行开始扫描直到第i行,
                //j==g[k]表示同一列,i-k==j-g[k]或者k-i==g[k]-j表示同一斜线
                for(k=0;k<i;k++)
                    if(j==g[k]||i-k==j-g[k]||k-i==g[k]-j)
                        conflict=1;
                if(conflict==0)
                {
                    g[i]=j;
                    Queen(g,i+1);
                }
            }
        }
    }
    public static void main(String[] args) 
    {
        int[] g=new int[8];
        System.out.println("所有方案皇后坐标如下:");
        Queen(g,1);//假设第1行已放置皇后
    }
}

原来的答案(c++源码)如下:
图片说明

  • 写回答

1条回答 默认 最新

  • threenewbee 2019-10-30 23:00
    关注

    原来的程序怎么写的,是否正确。
    public static void Queen(int[] g,int i)
    你这样写,g是传引用,也就是所有的递归调用,g都是修改的同一个

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?