짱아의 개발 기록장

백준 16924번. 십자가 찾기(c++) / 시뮬레이션 본문

Algorithm/Baekjoon

백준 16924번. 십자가 찾기(c++) / 시뮬레이션

jungahshin 2020. 7. 29. 14:19
반응형

시뮬레이션 문제입니다.

 

for문으로 돌면서 '*'이 있으면 그것을 십자가의 중점으로 생각하고 십자가가 있을 수 있는 자리인지를 확인했습니다.

그리고 있을 수 있는 자리라면, visited배열에 십자가에 해당하는 모든 점들을 방문처리했습니다.

 

 

코드 첨부

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// 십자가 찾기
#include <iostream>
#include <vector>
using namespace std;
 
int n, m, temp;
char cross[101][101];
int dx[4= {-1010};
int dy[4= {010-1};
vector<pair<pair<intint>int>> final;
int visited[101][101= {0, };
 
int main()
{
    cin>>n>>m;
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            cin>>cross[i][j];
        }
    }
 
    temp = min(n, m);
 
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            if(cross[i][j]=='*'){
                // 십자가 중심부의 *가 맞는지 확인
                int num = 0;
                vector<pair<intint>> v;
                v.push_back(make_pair(i, j));
                for(int k=1; k<=(temp/2); k++){ // 최대 (temp/2)만큼 확장될 수 있다.
                    // k만큼 확장
                    bool check = true;
                    for(int t=0; t<4; t++){
                        int nx = i+(dx[t]*k);
                        int ny = j+(dy[t]*k);
                        if(0<=nx && nx<&& 0<=ny && ny<&& cross[nx][ny]=='*'){
                            v.push_back(make_pair(nx, ny));
                        }else{
                            check = false;
                            break;
                        }
                        
                    }
                    if(check==false){ // 확장 실패
                        break;
                    }
                    num++;
                }
 
                // num만큼의 크기를 가지는 십자가
                if(num>0){
                    final.push_back(make_pair(make_pair(i, j), num));
                    for(int t=0; t<v.size(); t++){
                        visited[v[t].first][v[t].second] = 1;
                    }
                }
            }
        }
    }
 
    bool check = true;
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            if(cross[i][j]=='*' && !visited[i][j]){
                check = false;
            }
        }
    }
 
    if(check==false){
        cout<<"-1"<<"\n";
    }else{
        if(final.size()==0){
            cout<<"-1"<<"\n";
        }else{
            cout<<final.size()<<"\n";
            for(int i=0; i<final.size(); i++){
                cout<<final[i].first.first+1<<" "<<final[i].first.second+1<<" "<<final[i].second<<"\n";
            }            
        }
    }
 
    return 0;
}   
cs

 

문제 첨부

https://www.acmicpc.net/problem/16924

 

16924번: 십자가 찾기

십자가는 가운데에 '*'가 있고, 상하좌우 방향으로 모두 같은 길이의 '*'가 있는 모양이다. 십자가의 크기는 가운데를 중심으로 상하좌우 방향으로 있는 '*'의 개수이다. 십자가의 크기는 1보다 크

www.acmicpc.net

반응형
Comments