티스토리 뷰
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문을 어떻게 없앨 수 있을까?
다음과 같이 짤 수 있다!!
dx와 dy라는 변수의 추가와 함께 if문이 4개나 사라지면서 코드가 짧아졌다!!
0,1,2,3이 각각 U,L,R,D 이다. 포문은 그걸 뱅글뱅글 도는 것이다.
재밌는것 하나 더... 심지어 세줄이나 더 줄일 수 있다.
이렇게!
정말 엄청난 센스 아닌가????
( state != i ) 을 더하다니..
물론 가독성은 제일 위에 코드가 나은 것 같지만.. 짧은 코드 선호자라면 저런 방법으로 할 수 있다는 사실 ㅎㅎ
커링님 오늘도 감사
사천성 같이 두번 이내로 꺾이는 프로그램의 길을 찾을려고 이런 식으로 구현했는데..
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 ) 을 더하다니..
물론 가독성은 제일 위에 코드가 나은 것 같지만.. 짧은 코드 선호자라면 저런 방법으로 할 수 있다는 사실 ㅎㅎ
커링님 오늘도 감사
'Development > Algorithm' 카테고리의 다른 글
퀴즈6 해적들의 금화 문제 (1) | 2011.08.04 |
---|---|
퀴즈5 와인 1000개에서 독이 든 와인 찾기. (2) | 2011.08.04 |
퀴즈4 구분이 불가능한 알약 한개씩 먹기. (0) | 2011.08.04 |
퀴즈3 칼질 하기 (2) | 2011.08.04 |
퀴즈2 도화선 2개로 45분 재기. (0) | 2011.08.04 |
퀴즈1 토너먼트 경기 수 맞추기 (0) | 2011.08.04 |
문자열을 사전 순으로 정렬하기! (0) | 2010.10.04 |
Struct 안에 있는 value로 sort()를 이용하여 Struct를 정렬하자 (0) | 2010.10.04 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- C++
- AWS
- MFC
- jni강좌
- jni
- java
- gcc
- Quiz
- linux
- 안드로이드
- it
- 리눅스
- algorithm
- Cloud
- android
- NDK
- C
- API
- 프로그래밍
- source
- Troubleshooting
- kering
- Visual C++
- Python
- db
- winapi
- 음악
- database
- 드라이버
- driver
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함