NAVER

질문 C# 코딩 하노이 탑 질문드립니다
kso4**** 조회수 271 작성일2019.09.30
실행 까지는 되는데 
콘솔창에서 

[처리되지 않은 예외: System.IndexOutOfRangeException: 인덱스가 배열 범위를 벗어났습니다.
   위치: chill_01.HanoiArray..ctor(Int32 tray) 파일 E:\Practice.cs\chill_01\Program.cs:줄 31
   위치: chill_01.Program.Main(String[] args) 파일 E:\Practice.cs\chill_01\Program.cs:줄 14]

위와 같은 오류 메세지가 뜹니다.
책에 있는 예제를 적은 건데 혹시 고쳐야 할 부분이 있다면
알려주시면 감사합니다.
내공 100을 겁니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace chill_01
{
    class Program
    {
        static void Main(string[] args)
        {
            int tray = 3;
            HanoiArray hanoi = new HanoiArray(tray);
            hanoi.show();
        }
    }

    public class HanoiArray
    {//하노이 타워 배열
        int tray = 3; //접시 수
        int bar = 3;  //막대 수
        int[,] rings; // 하노이 타워를 표현하는 배열
        public HanoiArray(int tray)
        {
            this.tray = tray;
            rings = new int[tray, bar];
            for (int i = 0; 1 < rings.GetLength(0); i++)
            {
                int x = 2 * i + 1;
                rings[i, 0] = x;//1,3,5 접시 크기표현
            }//접시 크기 for문
        }//public HanoiArray
        public int[,] GetRings()
        {//ring 리턴
            return rings;
        }//GetRings 배열 리턴 함수
        public void MoveHahoi(int[,] a, int num,
                              char ringA, char ringB, char ringC)
        {
            if (num == 1)
            {
                ShowHanoi(a, ringA, ringB);
            }
            else
            {
                MoveHahoi(a, num - 1, ringA, ringB, ringC);
                ShowHanoi(a, ringA, ringB);
                MoveHahoi(a, num - 1, ringA, ringB, ringC);
            }

        }
        public void show()
        {
            ShowHanoi(this.rings);
            MoveHahoi(this.rings, tray, 'a', 'b', 'c');
        }//public void show view
        public void ShowHanoi(int[,] a, char ringA, char ringB)
        {
            int aa = 0;
            int ab = 1;
            switch (ringA)
            {
                case 'a': aa = 0; break;
                case 'b': aa = 1; break;
                case 'c': aa = 2; break;
            }
            switch (ringB)
            {
                case 'a': ab = 0; break;
                case 'b': ab = 1; break;
                case 'c': ab = 2; break;
            }
            Console.WriteLine(ringA + " bar쪽에 있던 링이" + ringB + " bar쪽으로 이동");
            Puts(a, aa, ab);//Put불러오기
            for (int i = 0; i < a.GetLength(0); i++)
            {//좌표값찍는데
                Console.Write("[\t");
                for (int j = 0; j < a.GetLength(1); j++)
                {
                    Console.Write(a[i, j] + "\t");
                }
                Console.WriteLine("]");
            }//좌표값
            Console.WriteLine("====================================================");
        }//public void ShowHanoi(쇼 하노이 로직 구현 함수)   
        public void ShowHanoi(int[,] a)
        {//하노이 view함수
            for (int i = 0; i < a.GetLength(0); i++)
            {//좌표값찍는데
                Console.Write("[\t");
                for (int j = 0; j < a.GetLength(1); j++)
                {
                    Console.Write(a[i, j] + "\t");
                }
                Console.WriteLine("]");
            }
            Console.WriteLine("====================================================");
        }//public ShowHanoi override
        public int HasTray(int [,] a,int bar)
        {
            int no = -1;
            for(int i = 0; i<a.GetLength(0); i++)
            {
                if (a[i,bar] != 0)
                {
                    no = i;
                    break;
                }//if문
            }//for문
            return no;
        }//public int HasTray
        
        //Change(a,2,2,0,0);==>2,2의 값을 0,0 으로 이동
        //2,2의 값을 0으로
        private void Change(int[,]a,int aa, int ab, int ba, int bb)
        {
            Console.WriteLine("({0},{1})==>({2},{3})",aa,ab,ba,bb);
            a[ba, bb] = a[aa, ab];
            a[aa, ab] = 0;
        }//private void Change
        public void Puts(int[,] a, int barA, int barB)
        {
            if (HasTray(a, barA) != -1)
            {
                if (HasTray(a, barA) != -1)
                {
                    Change(a, HasTray(a, barA), barA, HasTray(a, barB) - 1, barB);
                }//중첩if 2절
                else
                {
                    Change(a, HasTray(a, barA), barA, a.GetLength(0), barB);
                }
            }//중첩if 1절
        }//public void Puts
    }//class HanoiArray
}//namespace

프로필 사진

답변자님,

정보를 공유해 주세요.

1 개 답변
1번째 답변
프로필 사진
닌자고양이
바람신
C, C++ 50위, C# 10위, 데이터베이스 34위 분야에서 활동
본인 입력 포함 정보

전체 코드를 분석하기엔 너무 복잡해서 예외 발생한 곳 두군데만 주석 달았습니다.

public HanoiArray(int tray) { this.tray = tray; rings = new int[tray, bar]; // 아래 for 문 i < rings.GetLength(0) 인 듯 합니다. for (int i = 0; 1 < rings.GetLength(0); i++) { int x = 2 * i + 1; rings[i, 0] = x;//1,3,5 접시 크기표현 }//접시 크기 for문 }//public HanoiArray public void Puts(int[,] a, int barA, int barB) { if (HasTray(a, barA) != -1) { if (HasTray(a, barA) != -1) // HasTray(a, barB) 를 하려던게 아닌지요? { // 여기에 HasTray(a, barB) 가 -1 을 반환할때 ba에 잘못된 인덱스가 들어갑니다. Change(a, HasTray(a, barA), barA, HasTray(a, barB) - 1, barB); }//중첩if 2절 else { // 여기에 a.GetLength(0) 는 마지막 인덱스가 아닌 갯수 이므로 a.GetLength(0) - 1 을 해야하는게 아닌지요? Change(a, HasTray(a, barA), barA, a.GetLength(0)-1, barB); } }//중첩if 1절 }//public void Puts

2019.09.30.

  • 채택

    질문자가 채택한 답변입니다.

도움이 되었다면 UP 눌러주세요!
UP이 많은 답변일수록 사용자들에게 더 많이 노출됩니다.