八皇后问题__java:求问这里出现的异常问题

问题描述

八皇后问题__java:求问这里出现的异常问题

关于8皇后问题,这里为了简便就是4个皇后在排列,问题出在我每次把程序里的Net数组加到net set里面以后,就发生了改变,这就导致后续的重复方式被加入net set
(HashSet类型)里面,求问为什么会出现加入之后数组会发生改变?
下面是代码:

package chessloc;

import java.util.ArrayList;
import java.util.HashSet;
//net_set???????

class point {

int x;
int y;

point(int x, int y) {
    this.x = x;
    this.y = y;
}

}

public class Chessloc {

static int n = 4;
//net_set is for storing all of the possible way.
static HashSet<int[][]> net_set = new HashSet();
//remove is for recording the impossible place after one queen place.
static ArrayList<point> remove[][] = new ArrayList[n][n];
//Net is for recording the possible way for placing queen, each time finish it will be added into net_set.
static int[][] Net = new int[n][n];

public static void main(String[] args) {
    for (int p = 0; p < n; p++) {
        for (int m = 0; m < n; m++) {
            //here is for initialize reomve[][].
            for (int p_t = 0; p_t < n; p_t++) {
                for (int m_t = 0; m_t < n; m_t++) {
                    remove[p_t][m_t] = new ArrayList();
                }
            }
            Net = re();
            backtrace(p, m);
        }
    }
    System.out.println("final:");
    print();
    System.out.print(net_set.size());
}

static void backtrace(int index_x, int index_y) {
    Net[index_x][index_y] = 6;
    for (int i = 0; i < n; i++) {
        for (int m = 0; m < n; m++) {
            if (Net[i][m] == 0 && (Math.abs(index_x - i) == Math.abs(index_y - m) || i == index_x || m == index_y)) {
                point p = new point(i, m);
                remove[index_x][index_y].add(p);
                Net[i][m] = 1;
            }
        }
    }
    for (int x = 0; x < n; x++) {
        for (int y = 0; y < n; y++) {
            //a second point.
            if (Net[x][y] == 0) {
                backtrace(x, y);
                Net[x][y] = 0;
                remove(remove[x][y]);
                remove[x][y].clear();
            }
        }
    }
    if (isDone()) {
        System.out.println("correct case_Net:");
        Print();
        net_set.add(Net);
        System.out.println("After add in__Net:");
        Print();
        System.out.println("add inside_net_set:");
        print();
    }
}

//judge whether get the correct way.
public static boolean isDone() {
    int x = 0;
    for (int p = 0; p < n; p++) {
        for (int m = 0; m < n; m++) {
            x = (Net[p][m] == 6) ? x + 1 : x;
            if (Net[p][m] == 0) {
                return false;
            }
        }
    }
    return (x == n);
}

//here is for making the impossible place(under a way to place queen) become possible.
public static void remove(ArrayList<point> x) {
    for (point temp : x) {
        if (Net[temp.x][temp.y] == 1) {
            Net[temp.x][temp.y] = 0;
        }
    }
}

public static int[][] re() {
    int[][] N = new int[n][n];
    for (int p = 0; p < n; p++) {
        for (int m = 0; m < n; m++) {
            N[p][m] = 0;
        }
    }
    return N;
}

//here is for printing Net array.
public static void Print() {
    for (int p = 0; p < n; p++) {
        for (int m = 0; m < n; m++) {
            System.out.print(Net[p][m] + " ");
        }
        System.out.println("");
    }
}

//here is for printing net_set.
public static void print() {
    for (int[][] temp : net_set) {
        for (int p = 0; p < n; p++) {
            for (int m = 0; m < n; m++) {
                System.out.print(temp[p][m] + " ");
            }
            System.out.println("");
        }
        System.out.println();
    }
}

}
下面运行截图:

出现第一种case的时候运行运行正常
但是出现第二种case后,加入net set之后一种case就发生了改变。。。。。。、
求问如何修改?
对了,这个方法不是很好,效率很低,但是只是想修复它。。
谢谢了。

解决方案

因为你的hashset里的net指的是同一个位置的数组,这样就行了,加入的一个新的数组实例

 if (isDone()) {
        System.out.println("correct case_Net:");
        Print();
        int[][] Net2=new int[4][4];
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                Net2[i][j]=Net[i][j];
            }
        }
        net_set.add(Net2);
        System.out.println("After add in__Net:");
        Print();
        System.out.println("add inside_net_set:");
        print();
    }
时间: 2024-12-29 02:55:44

八皇后问题__java:求问这里出现的异常问题的相关文章

递归-(已解决)自己用java写的八皇后问题算法,可是不行,求告知原因

问题描述 (已解决)自己用java写的八皇后问题算法,可是不行,求告知原因 public class Test { public static void main(String[] args) { Empress a=new Empress(); a.find(0,0); System.out.println(a.map); } } class Empress{ public int[][] arry=new int[8][8]; public int map=0; public boolean

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组解.八皇后问题动态图形的实现,主要应解决以下

java-初学者求问覆写与否的方法调用问题

问题描述 初学者求问覆写与否的方法调用问题 在看Java开发实战经典的时候看到覆写一部分,大致代码如下: public class Hello { public static void main(String[] args) { new Student().fun(); } } class Person{ private void print() { System.out.println(""Person""); } void fun() { this.print(

c语言-求问一个C语言字符指针的问题

问题描述 求问一个C语言字符指针的问题 #include void Initialize (char * a, char * b) { a[0] = 'T'; a[1] = 'h'; a[2] = 'i'; a[3] = 's'; a[4] = ' '; a[5] = 'i'; a[6] = 's'; a[7] = ' '; a[8] = 'A'; a[9] = ''; b = a; b[8] = 'B'; } #define ARRAY_SIZE 10 char a[ARRAY_SIZE];

新人求问JSP传表单值到servlet出现乱码

问题描述 新人求问JSP传表单值到servlet出现乱码 代码如图 解决方案 你需要把提交的数据也设置为utf-8型 request.setCharacterEncoding("utf-8") 或者 全部改为 gbk 解决方案二: 全部改成gbk就好了 看下你的项目属性的编码格式 解决方案三: 1.JSP页面编码 2.Servlet设置编码 3.Tomcat设置编码 4.项目编码 解决方案四: 在输出文本内容前, 加上response.setContentType("text

求问,一道关于tomcat,java 的问题,求解答

问题描述 求问,一道关于tomcat,java 的问题,求解答 java.net.BindException: Address already in use: JVM_Bind at java.net.DualStackPlainSocketImpl.bind0(Native Method) at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106) at java.net.Abstract

ios-类似qq阅读的app 技术难点 求问大神

问题描述 类似qq阅读的app 技术难点 求问大神 app端 的阅读 收藏 目录 文字放大 各种 后端图书存储格式 等等 好多疑问 请问大神们有没有相关资料,或者建议啥的? 目前后端打算使用springmvc 前端ios android 数据库mysql 解决方案 这不是几句话说的清楚的.前端的界面和后端编程根本就是南辕北辙的两个方向,前者需要大量琐碎的经验,不是看资料能看来的.后者更是需要深厚的算法和架构知识. 你看看腾讯的招聘信息就知道了.如果真的有神秘资料可以让一个新手又能胜任前端又能胜任