[๋ฐฑ์ค€] BFS,DFS 2178,1012,14502, 2636, 4179, ๐ŸŽฏ

seunghyunยท2023๋…„ 4์›” 18์ผ
0

Test

๋ชฉ๋ก ๋ณด๊ธฐ
7/20

2178 ๋ฏธ๋กœ ํƒ์ƒ‰

๋ฌธ์ œ ๋งํฌ
BFS ๋ฌธ์ œ์ด๋‹ค. y,x๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์„œ 2์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

#include<bits/stdc++.h>
using namespace std;

const int max_n = 104;
int dy[4]={-1, 0, 1, 0};
int dx[4]={0, 1, 0, -1};
int n,m,a[max_n][max_n],visited[max_n][max_n],y,x;

int main()
{
    scanf("%d %d", &n, &m);
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            scanf("%1d", &a[i][j]);
        }
    }
    queue<pair<int,int>> q;
    visited[0][0]=1;
    q.push({0,0});
    
    while(q.size())
    {
        tie(y,x)=q.front(); q.pop();
        for(int i=0; i<4; i++)
        {
            int ny = y + dy[i];
            int nx = x + dx[i];
            if(ny<0 || ny>=n || nx<0 || nx>=m || a[ny][nx]==0) continue;
            if(visited[ny][nx]) continue;
            visited[ny][nx] = visited[y][x] + 1;
            q.push({ny, nx});
        }
    }
    
    printf("%d", visited[n-1][m-1]);
    return 0;
}

1012 ์œ ๊ธฐ๋† ๋ฐฐ์ถ”

๋ฌธ์ œ ๋งํฌ
connected component ๊ฐœ์ˆ˜๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.
DFS, BFS ๋ชจ๋‘ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•œ๋ฐ DFS๊ฐ€ ์กฐ๊ธˆ ๋” ์ฝ”๋“œ ๊ธธ์ด๋„ ์งง๋‹ค

#include<iostream>
using namespace std;

int dy[4]={-1,0,1,0};
int dx[4]={0,1,0,-1};
int m,n,k,y,x,ret,ny,nx,t;
int a[51][51];
bool visited[51][51];

void dfs(int y, int x)
{
    visited[y][x]=1; // ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    for(int i=0; i<4; i++)
    {
        ny = y + dy[i];
        nx = x + dx[i];
        if(ny<0 || nx<0 || ny>=n || nx>=m) continue;
        if(a[ny][nx] == 1 && !visited[ny][nx])
        {
            dfs(ny, nx);
        }
    }
    return;
}

int main()
{
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> t;
    while(t--)
    {
    	// ๋‹ค์Œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์œ„ํ•ด ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค
        fill(&a[0][0], &a[0][0] + 51*51, 0);
        fill(&visited[0][0], &visited[0][0] + 51*51, 0);
        ret = 0;
        
        cin >> m >> n >> k;
        for(int i=0; i<k; i++)
        {
            cin >> x >> y;
            a[y][x]=1;
        }
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                if(a[i][j]==1 && !visited[i][j])
                {
                    dfs(i,j);
                    ret++; // ํ•˜๋‚˜์˜ component์— ๋Œ€ํ•œ dfs๊ฐ€ ๋๋‚˜๋ฉด ret++
                }
            }
        }
        cout << ret << '\n';
    }
    return 0;
}

14502 ์—ฐ๊ตฌ์†Œ

๋ฌธ์ œ ๋งํฌ
์ˆœ์„œ ์ƒ๊ด€์—†์ด 3๊ฐœ์˜ ๋ฒฝ์„ ์„ธ์šด๋‹ค : combination

#include<bits/stdc++.h>
using namespace std;

int a[10][10], visited[10][10], n, m, ret;
vector<pair<int, int>> virusList, wallList; // ์ขŒํ‘œ๊ฐ’ ๊ธฐ๋ฐ˜
const int dy[] = {-1, 0, 1, 0};
const int dx[] = {0, 1, 0, -1};

void dfs(int y, int x){
    for(int i = 0; i < 4; i++){
        int ny = y + dy[i];
        int nx = x + dx[i];
        if(ny < 0 || ny >= n || nx < 0 || nx >= m || visited[ny][nx] || a[ny][nx] == 1) continue;
        visited[ny][nx] = 1;
        dfs(ny, nx);
    }
    return;
}

// ๋ฒฝ์„ ์„ธ์šฐ๋Š” ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ์˜ ์ˆ˜๋งˆ๋‹ค ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํผ๋œจ๋ฆฌ๋Š”๋ฐ ๋งค ๊ฒฝ์šฐ๋งˆ๋‹ค ์ดˆ๊ธฐํ™”ํ•ด์ค˜์•ผ ํ•œ๋‹ค
int solve(){
    fill(&visited[0][0], &visited[0][0] + 10 * 10, 0); // ์ดˆ๊ธฐํ™”
    for(pair<int, int> b : virusList){
        visited[b.first][b.second] = 1;
        dfs(b.first, b.second);
    } 

    int cnt = 0; // ์•ˆ์ „์˜์—ญ ์นด์šดํŠธ
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(a[i][j] == 0 && !visited[i][j]) cnt++; 
        }
    } 
    return cnt;  
}

int main(){
    cin >> n >> m;
    for(int i = 0; i <n; i++){
        for(int j = 0; j < m; j++){
            cin >> a[i][j];
            if(a[i][j] == 2) virusList.push_back({i, j});
            if(a[i][j] == 0) wallList.push_back({i, j});
        }
    }
    // wallList.size() C 3 (combination)
    for(int i = 0; i < wallList.size(); i++){
        for(int j = 0; j < i; j++){
            for(int k = 0; k < j; k++){
                a[wallList[i].first][wallList[i].second] = 1;
                a[wallList[j].first][wallList[j].second] = 1;
                a[wallList[k].first][wallList[k].second] = 1;
                ret = max(ret, solve());
                // ์›์ƒ๋ณต๊ตฌ
                a[wallList[i].first][wallList[i].second] = 0;
                a[wallList[j].first][wallList[j].second] = 0;
                a[wallList[k].first][wallList[k].second] = 0;
            }
        }
    }
    cout << ret << "\n";
    return 0;
}

2636 ์น˜์ฆˆ

๋ฌธ์ œ ๋งํฌ
dfs, bfs ๋กœ ํ•ด๋„ ๋œ๋‹ค. ํƒ์ƒ‰๋งŒ ํ•„์š”ํ•˜๋ฏ€๋กœ. ๊ทผ๋ฐ ๊ฐ€์ค‘์น˜๊ฐ€ ๊ฐ™๊ณ  ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค๋ฉด bfs๋กœ ํ•ด์•ผํ•œ๋‹ค~

#include <bits/stdc++.h>
using namespace std; 
int a[104][104], visited[104][104];
int dy[]={-1,0,1,0}, dx[] = {0,1,0,-1};   
int n,m,cnt,cnt2;
vector <pair<int,int>>v;
void go(int y,int x){
	visited[y][x] = 1;
    if(a[y][x]==1){ //์ด๋ฏธ ์น˜์ฆˆ๊ฐ€ ์žˆ๋‹ค๋ฉด
        v.push_back({y,x});
        return; // ์ข…๋ฃŒ
    }
    for(int i=0; i<4; i++){
        int ny = y + dy[i];
        int nx = x + dx[i];
        if(ny<0 || ny>=n || nx<0 || nx>=m || visited[ny][nx]) 
        	continue; 
        go(ny,nx);
    }
    return;
}


int main(){ 
    cin >> n >> m;
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            cin>>a[i][j];
        }
    }
    while(true){
        cnt2 =0; // ๋ชจ๋‘ ๋…น๊ธฐ ํ•œ ์‹œ๊ฐ„ ์ „์— ๋‚จ์•„์žˆ๋Š” ์น˜์ฆˆ์กฐ๊ฐ์ด ๋†“์—ฌ ์žˆ๋Š” ์นธ์˜ ๊ฐœ์ˆ˜
        fill(&visited[0][0],&visited[0][0] + 104 * 104,0);
        v.clear(); 
        go(0,0); 
        for(pair<int, int> b : v){
			cnt2++;
			a[b.first][b.second] = 0;
		}   
        bool flag = 0; // ์น˜์ฆˆ๊ฐ€ ๋‹ค ๋…น์•„๋ฒ„๋ฆฐ ์ƒํƒœ
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                if(a[i][j] != 0) flag = 1; // ์น˜์ฆˆ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด
            }
        }
        cnt++; // ์น˜์ฆˆ๊ฐ€ ๋ชจ๋‘ ๋…น์•„์„œ ์—†์–ด์ง€๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„
        if(!flag) break;
    }
    cout<< cnt << "\n" << cnt2 << '\n'; 
}

4179 ๋ถˆ! ๐ŸŽฏ

๋ฌธ์ œ ๋งํฌ

๋ฌธ์ œ ์ ‘๊ทผ

๋ณ‘ํ›ˆ์ด๊ฐ€ ๋ถˆ๋ณด๋‹ค ๋นจ๋ฆฌ ๋›ฐ์ณ๋‚˜์˜ฌ ๋•Œ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
๊ฐ€์ค‘์น˜๊ฐ€ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„์—์„œ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๐Ÿ‘‰ BFS

๋ถˆ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ์™€ ์ง€ํ›ˆ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๋น„๊ตํ•ด์„œ, (๋ถˆ๋ณด๋‹ค) ์ง€ํ›ˆ์ด๊ฐ€ ๋” ๋น ๋ฅด๋‹ค๋ฉด ์ „์ง„ํ•˜๋„๋ก ํ•œ๋‹ค.

๋˜ํ•œ ๋ถˆ์€ ์—ฌ๋Ÿฌ๊ฐœ์ผ ์ˆ˜ ์žˆ๊ณ , ์ง€ํ›ˆ์€ ํ•œ ๋ช…์œผ๋กœ ๊ณ ์ •๋˜์–ด์žˆ๋‹ค.

๋ฐ˜๋ก€

๋ถˆ์ด ์•„์˜ˆ ์—†๋‹ค๋ฉด fire_check ๋ผ๋Š” 2์ฐจ์› ๋ฐฐ์—ด์€ 0์˜๋กœ ์ •์˜๋œ๋‹ค.
๊ทธ๋ž˜์„œ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ํฐ ๊ฐ’(์—ฌ๊ธฐ์„œ INF)์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์ „์ฒด ์ฝ”๋“œ

#include<iostream>
#include<queue>
#include<algorithm>
#include<tuple>
using namespace std;

const int INF = 987654321;
char a[1004][1004]; // ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ฏธ๋กœ๋งต
int fire_check[1004][1004], person_check[1004][1004];
int dy[4] = { 1,0,-1,0 };
int dx[4] = { 0,1,0,-1 };
int n, m, sx, sy, ret, x, y;

// ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์ฒดํฌ
bool in(int a, int b) {
	return 0 <= a && a < n && 0 <= b && b < m;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	queue<pair<int, int>> q;
	cin >> n >> m;
	fill(&fire_check[0][0], &fire_check[0][0] + 1004 * 1004, INF);

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> a[i][j];
			if (a[i][j] = 'F') {
				fire_check[i][j] = 1;
				q.push({ i,j });
			}
			else if (a[i][j] == 'J') {
				sy = i;
				sx = j;
			}
		}
	}

	// ๋ถˆ์€ ๊ฐ ์ง€์ ์—์„œ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์‚ฐ๋œ๋‹ค
	while (q.size()) {
		tie(y, x) = q.front();
		q.pop();
		for (int i = 0; i < 4; i++) {
			int ny = y + dy[i];
			int nx = x + dx[i];
			if (!in(ny, nx)) continue;
			if (fire_check[ny][nx] != INF || a[ny][nx] == '#') continue;
			fire_check[ny][nx] = fire_check[y][x] + 1;
			q.push({ ny,nx });
		}
	}

	person_check[sy][sx] = 1;
	q.push({ sy,sx });
	while (q.size()){
		int y = q.front().first;
		int x = q.front().second;
		q.pop();
		// ์ง€ํ›ˆ์ด๋Š” ๋ฏธ๋กœ์˜ ๊ฐ€์žฅ์ž๋ฆฌ์— ์ ‘ํ•œ ๊ณต๊ฐ„์—์„œ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค
		if (x == m - 1 || y == n - 1 || x == 0 || y == 0) {
			ret = person_check[y][x];
			break;
		}

		for (int i = 0; i < 4; i++) {
			int ny = y + dy[i];
			int nx = x + dx[i];
			if (!in(ny, nx)) continue;
			if (person_check[ny][nx] || a[ny][nx] == '#') continue;
			// ๋ถˆ์ด ์ง€ํ›ˆ์ด๋ณด๋‹ค ๋น ๋ฅด๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด ์ง€ํ›ˆ์ด๋Š” ๊ฐˆ ์ˆ˜ ์—†๋‹ค
			if (fire_check[ny][nx] <= person_check[y][x] + 1) continue;
			// ์ง€ํ›ˆ์ด๊ฐ€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด
			person_check[ny][nx] = person_check[y][x] + 1;
			q.push({ ny,nx });
		}
	}
	if (ret != 0) cout << ret << '\n';
	else cout << "IMPOSSIBLE\n";
	return 0;
}

0๊ฐœ์˜ ๋Œ“๊ธ€