U E D R , A S I H C RSS

Randomwalk/조동영

2학년 1학기 자료구조 레포트용

~cpp 
#include <iostream> 
#include <ctime>
#include <iomanip>
using namespace std; 

void main(){

	srand(time(0));
	
	//바퀴벌레를 8방향으로 이동하게 할 배열
	int imove[] = {-1,0,1,1,1,0,-1,-1};
	int jmove[] = {1,1,1,0,-1,-1,-1,0};
	
	// 방의 크기
	int Xroom;
	int Yroom;
	
	// 바퀴벌레의 좌표값
	int ibug;
	int jbug;
	
	int count = 0;		// 총이동한 횟수를 계산하게될 integer 값
	bool existZero = false;		// 바퀴벌레가 모두 돌아다녔는지 확인할때 쓰일 bool형 값

	int i,j;
	
	// 바퀴벌레가 돌아다닐 방을 생성
	do{ 
		cout << "직사각형의 가로크기를 입력해주세요(2 < X <= 40) :";
		cin >> Xroom;
		cout << "직사각형의 세로크기를 입력해주세요(2 <= Y < 20) :";
		cin >> Yroom;
        if (Xroom > 2 && Xroom < 41 && Yroom > 1 && Yroom < 21) 
			break; 
        cout << "세로, 가로의 크기의 범위를 벗어났네요. 다시 입력하세요." << endl;
	}while(true); 

	// 2중동적배열을 만드는 함수
	int **room;

	room = new int*[Xroom];

	for (i=0; i<Xroom; i++)
		room[i] = new int[Yroom];
	
	// 생성한 동적배열을 초기화
	for (i=0;i<Xroom;i++)
		for(j=0;j<Yroom;j++)
			room[i][j] =0;


	// 바퀴벌레를 생성하는 do ~ while 문
	do{ 
		cout << "바퀴벌레의 초기값 X를 입력해주세요 :";
		cin >> ibug;
		cout << "바퀴벌레의 초기값 Y를 입력해주세요 :";
		cin >> jbug;
		if (ibug >= 0 && ibug < Xroom && jbug >= 0 && jbug < Yroom) 
			break; 
        cout << "바퀴벌레가 방의 범위를 벗어났네요. 다시 입력하세요." << endl;
	}while(true); 

	room[ibug][jbug] = 1; // 바퀴벌레 초기값의 초기화
	
	// 바퀴벌레를 이동시키고 모두 이동하면 종료하는 while문
	while(count<50000 && existZero == false){
		
		existZero = true;

		for(i=0;i<Xroom;i++){
			for(j=0;j<Yroom;j++){
				if(room[i][j] == 0)
					existZero = false;
			}
		}
		
		int random = rand()%8;	// 0~7 까지의 임의의 수 생성해서 random 이란 integer 값에 대입
		// 바퀴벌레가 범위를 벗어나지 않도록 해주는 함수
		if (ibug + imove[random] <0 || ibug + imove[random] > Xroom-1 || 
			jbug + jmove[random] <0 || jbug + jmove[random] > Yroom-1)
			continue;
		// 바퀴벌레를 이동시키고 카운트를 하는 함수
		else{
			room[ibug+imove[random]][jbug+jmove[random]]++;
			ibug = ibug + imove[random];
			jbug = jbug + jmove[random];
			count++;			
		}
		
		
	}
	//이동 횟수 출력
	cout << "각 방에 이동한 횟수 : \n\n";
	for(i=0;i<Xroom;i++){
		for(j=0;j<Yroom;j++)
			cout << setw(3) << room[i][j];
		cout << endl;
	}
	//총 이동횟수 출력
	cout << "\n총 이동한 횟수 :" << count << endl;

	//메모리 해제
	for (i=0; i<Xroom;i++)
		delete[] room[i];
	delete [] room;

}

쓰레드

코딩시간
대략2시간

초반에 알고리즘짜는데 어려움이 있었는데..
2차원동적배열은 처음 써본다ㅋ
오랜만에 C++ 로 코딩해보는듯...ㅋ 재미있었당
다른 레포트의 압박이 없어서 낮에 제정신에 짰으면 더 금방했을듯.. 지금시간 3시 정신이 몽롱하다.. ㅋ

지금 코드를 보면 한번 움직일 때마다 모든 타일을 돌아다니면 0이 남아있는 지를 검사하는 시간낭비가 있구나. 이런 낭비를 없애기 위해 내가 1년전에 썼던 알고리즘을 하나 알려줄께. m*n의 공간에서 값이 0인 타일을 밟게되면 카운트를 +1해주면 카운트의 값이 m*n이 되면 그 공간의 모든 타일을 적어도 한번씩은 밟았다는 얘기가 되지. 한번 움직일 때마다 그 카운트 값을 검사하면 되겠지? 이해 안되면 나중에 물어보고. -강희경

2차원 동적 배열할때 벡터를 사용해도 좋음. RandomWalk2/Vector로2차원동적배열만들기 자료구조 숙제는 STL을 사용하면 더 편하게 할수 있는거 같다. - 상협
편하기야 하겠지만 남발하는건 좋지 않음. 특히 자료구조 숙제같은 경우에는 :( - 임인택


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-05-27 07:09:18
Processing time 0.1012 sec