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이 되면 그 공간의 모든 타일을 적어도 한번씩은 밟았다는 얘기가 되지. 한번 움직일 때마다 그 카운트 값을 검사하면 되겠지? 이해 안되면 나중에 물어보고. -강희경