Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
Archives
Today
Total
관리 메뉴

최고를 향해 최선을 다하자

[SWEA] 2105. 디저트 카페 본문

SWEA

[SWEA] 2105. 디저트 카페

응애개발자 2020. 6. 6. 15:46

안녕? 나는 응애개발자

 

 

오늘은 좀 화가 나있다. 왜냐면....

나는 맥을 이용하는데, 맥 터미널로 돌리면 잘만 나오는 결과가 SWEA에서 돌리기만 하면 이상한 것이다.

 

평소에 init_()이란 함수를 만들어 일일이 초기화를 했는데, 실패했다.

삽질하다가 memset을 이용했는데 성공적으로 잘만됐다.

 

화가 났다.

 

고작 초기화 때문에 30분을 삽질했다는 이 사실이!!!

한번에 통과할 수 있었는데 2번만에 통과한 이 사실이!!!!!!!!!!!

 

오늘 문제는 완탐(dfs)를 사용해서 풀면 되는 간단한 문제였다.

코드 리뷰, 시작!

#include <iostream>
#include <cstring>

using namespace std;

int N;
int map[20][20];
int chk[20][20];	//갔던곳은 안가기위한 배열
int dessert[101];	//먹은 디저트는 안먹기 위한 배열
int ans;	

pair<int, int> start;	//처음좌표를 저장할 pair

int dy[4] = {1,1,-1,-1};	//하우->하좌->상좌->상우
int dx[4] = {1,-1,-1,1};


//맵의 범위를 체크하는 함수
bool check(int y, int x){
    if((y>=0) && (x>=0) && (y<N) && (x<N))
        return true;
    return false;
}

//완탐
void dfs(int y, int x, int prev, int cnt){
	//사각형을 만들고 처음자리에 왔다면
    if((cnt>1) && (start.first==y) && (start.second==x)){
        ans = max(ans, cnt);
        return;
    }
    
    //현재 좌표 왔다고 체크해주기
    chk[y][x] = 1;
    dessert[map[y][x]] = 1;

    for(int i=0; i<2; i++){
    
    	//prev+i를 하면 사각형을 만들면서 가겠죠?
        int ny = y + dy[prev + i];
        int nx = x + dx[prev + i];    
        
	//맵 안에 있고, 가본적없고, 먹어본적 없는 디저트를 팔고있는 카페라면
        if(check(ny,nx) && chk[ny][nx]==0 && dessert[map[ny][nx]]==0){
            dfs(ny,nx,prev+i,cnt+1);
        }
        
        //초기좌표라면    
        else if(start.first==ny && start.second==nx)
            dfs(ny,nx,prev+i,cnt+1);
    }
    
    //완탐이니까 왔던곳은 되돌려주기
    chk[y][x] = 0;
    dessert[map[y][x]] = 0;
}

int main(int argc, char** argv){
    int test_case;
    cin>>test_case;
    for(int T=1; T<=test_case; T++){
    
        //화가났던 초기화 부분, 앞으로 memset만 사용할거임 화가나 화가.
        ans = -1;
        memset(dessert, 0, sizeof(dessert));
        
        cin>>N;
        for(int i=0; i<N; i++){
            for(int j=0; j<N; j++){
                cin>>map[i][j];
                chk[i][j] = 0;
            }
        }
        for(int i=0; i<N; i++){
            for(int j=0; j<N; j++){
                start.first = i;
                start.second = j;
                dfs(i,j,0,0);
            }
        }
        cout<<"#"<<T<<" "<<ans<<endl;
    }
    return 0;
}

 

 

 

'SWEA' 카테고리의 다른 글

[SWEA] 2382. 미생물 격리  (0) 2020.06.06
[SWEA] 4013. 특이한 자석  (0) 2020.06.05
[SWEA] 2117. 홈 방범 서비스  (0) 2020.06.05
Comments