Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

2次元配列の中身を変えると、他の配列の中身も変わってしまします。

実行すれば分かるのですが、list[p]に数値を入れる際、pは1以上にしかならないのに、list[0]の中身も書き換わってしまいます。
どうしても原因が分かりません。助けてください。

import java.io.*;

public class puzzle8{
    public static void main(String[] args){

        int[][] list;
        list = new int[100][11];

        int[][] idou = {
            {0,0,0,0,0},
            {2,4,-1,-1,-1},
            {1,5,3,-1,-1},
            {2,6,-1,-1,-1},
            {1,5,7,-1,-1},
            {2,4,6,8,-1},
            {3,5,9,-1,-1},
            {4,8,-1,-1,-1},
            {5,7,9,-1,-1},
            {6,8,-1,-1,-1},
        };
        int p = 1;

        

//初期状態

        list[0][0]=0;//探索済みフラグ
        list[0][1]=2;
        list[0][2]=8;
        list[0][3]=3;
        list[0][4]=1;
        list[0][5]=6;
        list[0][6]=4;
        list[0][7]=7;
        list[0][8]=0;
        list[0][9]=5;
        list[0][10]=-1;//前状態へのフラグ
        int[] c = {1,2,8,3,1,6,4,7,0,5,-1};    
//最終状態
        int[] kansei = {1,2,3,8,0,4,7,6,5};

hyouji(list);    

//ここから探索
    outer:
    for(int i=0; i<=p; i++){
        if(list[i][0]==0){
        for(int j=1; j<=9; j++){
            if(list[i][j]==0){
            for(int l=0; l<5; l++){
                if(idou[j][l]>0){
                    list[p] = list[i];
                    list[p][j]=list[p][l];
                    list[p][l]=0;
                    list[p][10] =i;
                    hantei(list[p],kansei);
                    p++;
                    hyouji2(list[i]);                        

                    hyouji(list);
                    }else if(idou[j][l]==-1){
                    list[i][0]=1;
                    break outer;
                    }
            }        
            }
        }        
        }
        
    }                                
    hyouji(list);            
    }

                    
        






//交換
    public static int[] koukan(int[] k,int j,int l){
        k[j]=k[l];
        k[l]=0;
        return k;
    }

//判定
    public static void hantei(int[] h,int[] e){
        outer:
        for(int i=1; i<=9; i++){
            if(h[i] != e[i]){
                break outer;
            }
            if(i==9){
                syuuryou();
            }        
        }
    }
    
    public static void syuuryou(){
        System.out.println("探索完了");        
    }

//表示
    public static void hyouji(int[][] a){
        for(int i = 0; i < 10; i++){
            for(int j = 0; j < a[i].length; j++){
                System.out.print(a[i][j]);
            }
            System.out.println();
        }
        
    }

//表示2
    public static void hyouji2(int[] a){
        System.out.println();System.out.println();
        for(int i = 0; i < a.length; i++){
            System.out.print(a[i]);
            }
        System.out.println();System.out.println();
    }
                    


                    

}

5

回答

89964

閲覧

5件の回答

評価

0

ぱっと見ですが、

>}else if(idou[j][l]==-1){
>list[i][0]=1;

i = 0のときにここに来ると、書き換わるんじゃないでしょうか。

評価

0

list[p] = list[i];
これがまずかったみたいです。
配列を丸ごと配列には入れられないみたいです。。。

評価

0

たしかにできませんね。
配列そのものはプリミティブではないので、
String a = b;
などと同様、コピーはできません。

System.arraycopyを使うのが、スマートです。

評価

0

System.arraycopyとはなんぞですか?

評価

0

検索すればすぐでてきます。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。