U E D R , A S I H C RSS

Random Walk/은지

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

void move(int dir);
int check_all(int);
void display(int);

int **walk;
int **check;

int row, col;

int main()
{
	int size, i, j;
	int end , direct ;
	
	cout << "=random walk problem= \n";
	cout << "배열 크기 입력 : "  ;
	cin >> size;

	//동적 배열로 walk판 만듬  
	walk = new int *[size+2];
	for (i=0; i<size+2; i++)
		walk[i] = new int[size+2];

	//동적배열로 check판 만듬 
	check = new int *[size+2];
	for (i=0; i<size+2; i++)
		 check[i] = new int[size+2];

	//배열 초기화 
	for(i=0; i<size+2; i++)
		for(j=0; j<size+2; j++)
		{
			if (i==0 || i==size+1 || j==0 || j==size+1)
				walk[i][j] = -1;
			else
				walk[i][j] = 0;

			check[i][j] = 0;
		}


	srand(time(0));
	row = (rand() % size)+1;
	col = (rand() % size)+1;
		
	do{
				
		direct = rand() % 8;		//방향 결정 

		 move(direct);	                  //결정된 방향으로 움직임
		 end = check_all(size);		//모든 판을 다 갔는지 체크 

	}while(!end);

	//결과 출력 
	display(size);

	return 0;
}


int check_all(int size)
{
	int sum =0;
	
	for(int i=0; i<size+2; i++)
		for(int j=0; j<size+2; j++)
			sum += check[i][j];

	if(sum == size*size)
		return 1;
	else
		return 0;
}


void move(int dir)
{
	switch(dir)
	{
		case 0 : if (walk[row-1][col] != -1)
				 {
					 row--;
					 walk[row][col]++;
					check[row][col] = 1;

				 }

			break;
		case 1 : if (walk[row-1][col+1] != -1) 
				 {
					 row--; col++;
					walk[row][col]++;
					check[row][col] = 1;
 
				 }
			break;

		case 2 :if (walk[row][col+1] != -1)
				{
					col++;
					walk[row][col]++;
					check[row][col] = 1;
				}
			break;
		case 3 : if (walk[row+1][col+1] != -1)
				 {
					 row++; col++;
					walk[row][col]++;
					check[row][col] = 1;
				 }

			break;
		
		case 4: if (walk[row+1][col] != -1) 
				{
					row++;
					walk[row][col]++;
					check[row][col] = 1;				
				}

			break;
		case 5 : if (walk[row+1][col-1] != -1) 
				 {
					 row++; col--;
					walk[row][col]++;
					check[row][col] = 1; 
				 }
			break;
		case 6 : if (walk[row][col-1] != -1) 
				 {
					 col--;
					walk[row][col]++;
					check[row][col] = 1;
					
					 
				 }
			break;
		case 7 : if (walk[row-1][col-1] != -1) 
				 {
					 row--; col--;
					 walk[row][col]++;
					check[row][col] = 1;				 }
			break;
	}

}

	
void display(int size)
{
	int count = 0;

	for(int i=1; i<size+1; i++)
	{
		for(int j=1; j<size+1; j++)
		{
			cout << walk[i][j] << "\t";
			count += walk[i][j];

		}
		cout <<"\n";
	}

	cout << "총 움직인 횟수 : "  << count << "\n";
}



음..방향을 배열루 입력시키믄 switch문을 길게 안써두 되는군..
그리구 check판이 없어두 끝나는걸 알 수 있을꺼 같다.
고쳐야지..


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