본문 바로가기
알고리즘

[알고리즘] c++ cpp 홈 방범 서비스

by keel_im 2020. 10. 8.
반응형

포인트

1. bfs 를 잘 이해하고 있는가?

2. 십자가 형태로 점점 늘어간다. bfs 

🧶문서는 항상 수정 될 수 있습니다. 비판은 환영합니다. 

#include <iostream>
#include <cstring>
#include <queue>
#include <tuple>

using namespace std;

int n, m, answer;
int map[20][20];
bool visited[20][20];

int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};


int calc(int k) {
    return (k * k) + (k - 1) * (k - 1);
}

void bfs(int a, int b) {
    queue<pair<int, int>> q;
    q.push(make_pair(a, b));
    visited[a][b] = true;
    int cnt = 0;

    if (map[a][b] == 1) cnt += 1;
    int service = 1;

    while (!q.empty()) {
        if (service > n + 1) //서비스가 크면 끊고 
            break;
            
        if (cnt * m - calc(service) >= 0) { //계산
            answer = max(answer, cnt);
        }

        int size = q.size(); // 턴마다 처리를 해야 한다.
        for (int qs = 0; qs < size; qs++) {
            int x, y;
            tie(x, y) = q.front();
            q.pop();

            for (int i = 0; i < 4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];

                if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue; // 범위 체크
                if (!visited[nx][ny]) { // 방문하지 않으면
                    q.push(make_pair(nx, ny));
                    visited[nx][ny] = true;
                    if (map[nx][ny] == 1) { //1이면
                        cnt += 1;
                    }
                }
            }
        }
        service += 1;
    }
}

int main() {
    int testcase;
    cin >> testcase;
    for (int t = 1; t <= testcase; t++) {
        answer = 0;
        memset(map, 0, sizeof(map));

        cin >> n >> m;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cin >> map[i][j];
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                memset(visited, false, sizeof(visited)); //초기화
                bfs(i, j);
            }
        }

        cout << "#" << t << " " << answer << '\n';
    }

    return 0;
}

 

반응형

댓글