티스토리 뷰

int go( int search, int a, int b, int state, int turning ) { if( found == 1 ) return 1; if( turning > 3 ) //맨처음 시작을 생각해서 3임 { return 0; } if( map[a][b] == search && state != START ) { sx = a; sy = b; found = 1; return 1; } v[a][b] = 1; //U if( v[a-1][b] == 0 && ( map[a-1][b] == 0xFF || map[a-1][b] == search ) && a > 0 ) { if( state == U ) go( search, a-1, b, U, turning ); else go( search, a-1, b, U, turning + 1 ); } //L if( v[a][b-1] == 0 && ( map[a][b-1] == 0xFF || map[a][b-1] == search ) && b > 0 ) { if( state == L ) go( search, a, b-1, L, turning ); else go( search, a, b-1, L, turning + 1 ); } //R if( v[a][b+1] == 0 && ( map[a][b+1] == 0xFF || map[a][b+1] == search ) && b < COL-1 ) { if( state == R ) go( search, a, b+1, R, turning ); else go( search, a, b+1, R, turning + 1 ); } v[a][b] = 0; return 0; }


사천성 같이 두번 이내로 꺾이는 프로그램의 길을 찾을려고 이런 식으로 구현했는데..
if문이 너무 많아서 보기가 좋지 않다. 실제로 길찾기 프로그램을 짜다보면 위, 양옆, 아래 이렇게 4부분을 분기처리 해야하는 상황이 생긴다.
근데 그러면 소스가 너무 길어져서 싫다 -.-;; 그리고 개인적으로 if문이 많은것도 좋아하지 않는다.

그럼 if문을 어떻게 없앨 수 있을까?
다음과 같이 짤 수 있다!!

int sx,sy;
int found;

const int START = -1;
const int U = 0;
const int L = 1;
const int R = 2;
const int D = 3;


int go( int search, int a, int b, int state, int turning )
{

	// U L R D
	int dx[] = { -1, 0, 0, 1 };
	int dy[] = { 0, -1, 1, 0 };

	if( found == 1 )
		return 1;

	if( turning > 3 ) //맨처음 시작을 생각해서 3임
	{
		return 0;
	}

	if( map[a][b] == search && state != START )
	{
		sx = a;
		sy = b;
		found = 1;
		return 1;
	}

	v[a][b] = 1;



	for( int i = 0; i < 4; i++ )
	{
		int x = a+dx[i];
		int y = b+dy[i];
		if( x >= 0 && x < ROW && y > 0 && y < COL &&
			v[x][y] == 0 && ( map[x][y] == 0xFF || map[x][y] == search ) )
		{
			if( state == i )
				go( search, x, y, i, turning );
			else
				go( search, x, y, i, turning+1 );
		}
	}
	v[a][b] = 0;
	return 0;
}


dx와 dy라는 변수의 추가와 함께 if문이 4개나 사라지면서 코드가 짧아졌다!!
0,1,2,3이 각각 U,L,R,D 이다. 포문은 그걸 뱅글뱅글 도는 것이다.

재밌는것 하나 더... 심지어 세줄이나 더 줄일 수 있다.

이렇게!

for( int i = 0; i < 4; i++ )
	{
		int x = a+dx[i];
		int y = b+dy[i];
		if( x >= 0 && x < ROW && y > 0 && y < COL &&
			v[x][y] == 0 && ( map[x][y] == 0xFF || map[x][y] == search ) )
		{
			go( search, x, y, i, turning + (state != i));
		}
	}

정말 엄청난 센스 아닌가????
( state != i ) 을 더하다니..

물론 가독성은 제일 위에 코드가 나은 것 같지만.. 짧은 코드 선호자라면 저런 방법으로 할 수 있다는 사실 ㅎㅎ

커링님 오늘도 감사
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함