반응형

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

 

[문제풀이]

1.BFS로 풀수 있다. 

2.L:육지로 이동가능한곳, W:물로 이동할 수 없다 

3.L만 찾아서 1개씩 큐에 저장후 이동할 수 있는 가장 먼 거리를 찾는 문제이다.

4.map정보가 같은 크기의 visited배열을 만들어서 방문 기록을 하고 매번 초기화 해줘야한다.

 

#include <iostream>
#include <queue>
#include <memory.h>
using namespace std;
#define MAXN (50)
int N, M;//세로, 가로
char map[MAXN+10][MAXN+10];//지도정보
int visited[MAXN+10][MAXN+10];//방문 표시 
struct Q{
	int y,x,t;
};
int count=0,ans=-1;
int BFS(int y, int x,int t){
	queue<Q>q;
	int dy[]={-1,1,0,0};//동서남북
	int dx[]={0,0,-1,1};
	//1.초기화 
	count=0;
	q={};
	//2.큐에 초기값 저장 
	q.push({y,x,t});	
	//3.반복문 
	while(!q.empty()){
		Q cur=q.front();q.pop();
		visited[y][x]=1;

		for(int i=0; i<4; i++){
			t=cur.t;
			int ny=cur.y+dy[i];
			int nx=cur.x+dx[i];
			if((ny<0) || (ny>=N) || (nx<0) || (nx>=M) || map[ny][nx]!='L') continue;
			if(visited[ny][nx]==0){
				visited[ny][nx]=1;
				q.push({ny,nx,t+1});
				count=t+1;
				if(ans<count) ans=count;//ans에 최대값 업데이트 
			}
		}
	}
	return ans;
}
void Solve(){
	for (int i=0; i<N; i++){
		for (int j=0; j<M; j++){
			if(map[i][j]=='L'){
				ans=BFS(i,j,0);
				memset(visited,false,sizeof(visited));
			}
		}
	}
	cout<<ans<<endl;
}
void InputData(){
	cin>>N>>M;
	for (int i=0; i<N; i++){
		cin>>map[i];
	}
}
int main(){
	InputData();
	Solve();
	return 0;
}
반응형

'Algorithm > BFS,DFS' 카테고리의 다른 글

[c++][백준]뱀과 사다리  (0) 2022.05.16
[C++][백준]1520 내리막길  (0) 2022.04.10
[C++][백준]14502 연구소  (0) 2022.04.10
[C++][백준]적록색약  (0) 2022.04.10
[c++][algoritm][baekjoon]7562 나이트의 이동  (0) 2021.09.23
반응형

www.acmicpc.net/problem/7576

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

문제

철수의 토마토 농장에서는 토마토를 보관하는 큰 창고를 가지고 있다. 토마토는 아래의 그림과 같이 격자 모양 상자의 칸에 하나씩 넣어서 창고에 보관한다. 

창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만, 아직 익지 않은 토마토들도 있을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토의 인접한 곳은 왼쪽, 오른쪽, 앞, 뒤 네 방향에 있는 토마토를 의미한다. 대각선 방향에 있는 토마토들에게는 영향을 주지 못하며, 토마토가 혼자 저절로 익는 경우는 없다고 가정한다. 철수는 창고에 보관된 토마토들이 며칠이 지나면 다 익게 되는지, 그 최소 일수를 알고 싶어 한다.

토마토를 창고에 보관하는 격자모양의 상자들의 크기와 익은 토마토들과 익지 않은 토마토들의 정보가 주어졌을 때, 며칠이 지나면 토마토들이 모두 익는지, 그 최소 일수를 구하는 프로그램을 작성하라. 단, 상자의 일부 칸에는 토마토가 들어있지 않을 수도 있다.

입력

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토들의 정보가 주어진다. 즉, 둘째 줄부터 N개의 줄에는 상자에 담긴 토마토의 정보가 주어진다. 하나의 줄에는 상자 가로줄에 들어있는 토마토의 상태가 M개의 정수로 주어진다. 정수 1은 익은 토마토, 정수 0은 익지 않은 토마토, 정수 -1은 토마토가 들어있지 않은 칸을 나타낸다.

토마토가 하나 이상 있는 경우만 입력으로 주어진다.

출력

여러분은 토마토가 모두 익을 때까지의 최소 날짜를 출력해야 한다. 만약, 저장될 때부터 모든 토마토가 익어있는 상태이면 0을 출력해야 하고, 토마토가 모두 익지는 못하는 상황이면 -1을 출력해야 한다.

 

문제풀이 

1. 입력을 받으면서 익은 토마토 위치를 모두 queue에 저장한다.

2. 1인 위치를 모두 저장 후 queue에서 1의 위치를 읽어와서 상하좌우를 채크해서 0이면 +1씩 증가 시켜 준다.

3. 읽은 좌표 사방을 채크해서 방문하지 않았고 map==0인경우 queue에 저장 

 

6 4

0 0 0 0 0 0

0 0 0 0 0 0

0 0 0 0 0 0

0 0 0 0 0 1

 

 

1일 
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 1
0 0 0 0 1 1
2일 
0 0 0 0 0 0
0 0 0 0 0 2
0 0 0 0 2 1
0 0 0 2 1 1
3일 
0 0 0 0 0 3
0 0 0 0 3 2
0 0 0 3 2 1
0 0 3 2 1 1
4일 
0 0 0 0 4 3
0 0 0 4 3 2
0 0 4 3 2 1
0 4 3 2 1 1
5일 
0 0 0 5 4 3
0 0 5 4 3 2
0 5 4 3 2 1
5 4 3 2 1 1
6일 
0 0 6 5 4 3
0 6 5 4 3 2
6 5 4 3 2 1
5 4 3 2 1 1
7일 
0 7 6 5 4 3
7 6 5 4 3 2
6 5 4 3 2 1
5 4 3 2 1 1
8일 
8 7 6 5 4 3
7 6 5 4 3 2
6 5 4 3 2 1
5 4 3 2 1 1
       

 

6 4

0 -1 0 0 0 0

-1 0 0 0 0 0

0 0 0 0 0 0

0 0 0 0 0 1

 

1일 
0 -1 0 0 0 0
-1 0 0 0 0 0
0 0 0 0 0 1
0 0 0 0 1 1
2일 
0 -1 0 0 0 0
-1 0 0 0 0 2
0 0 0 0 2 1
0 0 0 2 1 1
3일 
0 -1 0 0 0 3
-1 0 0 0 3 2
0 0 0 3 2 1
0 0 3 2 1 1
4일 
0 -1 0 0 4 3
-1 0 0 4 3 2
0 0 4 3 2 1
0 4 3 2 1 1
5일 
0 -1 0 5 4 3
-1 0 5 4 3 2
0 5 4 3 2 1
5 4 3 2 1 1
6일 
0 -1 6 5 4 3
-1 6 5 4 3 2
6 5 4 3 2 1
5 4 3 2 1 1
7일 
0 -1 6 5 4 3
-1 6 5 4 3 2
6 5 4 3 2 1
5 4 3 2 1 1
         

 

 

/*baekjoon 7576 토마토 BFS*/
#include <bits/stdc++.h>
using namespace std;

#define MAXN ((int) 1e3+10 )

int N, M ;// 정점수 , 간선수 , 시작점 
int mmap[MAXN][MAXN];
bool mapCheck[MAXN][MAXN];
int path[MAXN][MAXN];
int cnt;
int dy[4] = {-1,1,0,0};
int dx[4] = {0,0,1,-1};
queue<pair<int,int>> q;

bool isInside(int a, int b){
	return (a>=0 && a<N) && (b>=0 && b<M);
}

void Solve(){
	int x,y,nx,ny;
	while(!q.empty()) {
		y = q.front().first;
		x = q.front().second;
		q.pop();
		for (int i = 0; i < 4; i++) {
			ny = y + dy[i];
			nx = x + dx[i];
			if(isInside(ny, nx) && mmap[ny][nx] == 0 && mapCheck[ny][nx] == 0 ){
				mapCheck[ny][nx] = 1;
				q.push( pair<int, int>(ny, nx) );
				path[ny][nx] = path[y][x] + 1;
			}
		}
	}
}
void InputData(){
	cin >> M >> N;
	for( int i=0; i < N; i++){
		for( int j=0; j < M; j++){
			cin >> mmap[i][j];
			if(mmap[i][j]==1){
				q.push( pair<int,int>(i, j) );
				mapCheck[i][j]=1;
			}
		}
	}
}
int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	InputData();
	Solve();

	for( int i=0; i < N; i++){
		for( int j=0; j < M; j++){
			if( mmap[i][j] == 0 && path[i][j] == 0 ){
				cout << -1 << endl;	
				return 0;
			}
		}
	}

	int ans = -1;
	for( int i=0; i < N; i++){
		for( int j=0; j < M; j++){
			if( path[i][j] > ans ){
				ans = path[i][j];	
			}
		}
	}
	cout << ans << endl;
	return 0;
}
/*baekjoon 7576 토마토 BFS*/
반응형
반응형

문제

그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.

입력

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

출력

첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.

 

예제 입력1
4 5 1
1 2
1 3
1 4
2 4
3 4

예제 출력1
1 2 4 3
1 2 3 4

예제 입력2
5 5 3
5 4
5 2
1 2
3 4
3 1

예제 출력2
3 1 2 5 4
3 1 4 2 5


예제 입력 3 
1000 1 1000
999 1000

예제 출력 3 
1000 999
1000 999

 

풀이 

1.입력 

M개의 간선 입력을 matrix로 할 수도 있고, start, end각각으로 입력 받아서 할 수도 있다. 

matrix로 입력을 받아서 출력을 해보면 아래와 같다.

0 1 1 1 
1 0 0 1 
1 0 0 1 
1 1 1 0 

2. 방문한 적은 있는 지를 check해 주기 위한 배열을 만들어서 재 방문하지 않도록 해 준다. 

bool visited[1000]

3.DFS는 재귀함수, BFS는 큐를 이용해서 구현한다. 

4.matrix값이 1이고 visited가 false 즉 아직 방문하지 않은 경우에 대해서 각각 

DFS는 재귀함수 호출하고 BFS는 그 값을 queue에 저장한다. 

 

 

실제 값들이 어떻게 찍히는지 확인 한 내용이니 참고바랍니다.

더보기

DFS start!!

result: 1 2 4 3 

 

st, i, mat[st][i] , visited[i]1 1 0 1
st, i, mat[st][i] , visited[i]1 2 1 0

st, i, mat[st][i] , visited[i]2 1 1 1
st, i, mat[st][i] , visited[i]2 2 0 1
st, i, mat[st][i] , visited[i]2 3 0 0
st, i, mat[st][i] , visited[i]2 4 1 0

st, i, mat[st][i] , visited[i]4 1 1 1

st, i, mat[st][i] , visited[i]4 2 1 1
st, i, mat[st][i] , visited[i]4 3 1 0

st, i, mat[st][i] , visited[i]3 1 1 1
st, i, mat[st][i] , visited[i]3 2 0 1
st, i, mat[st][i] , visited[i]3 3 0 1
st, i, mat[st][i] , visited[i]3 4 1 1
st, i, mat[st][i] , visited[i]4 4 0 1
st, i, mat[st][i] , visited[i]1 3 1 1
st, i, mat[st][i] , visited[i]1 4 1 1

 

BFS start!!

result: 1 2  3 4

 

st, i, mat[temp][i] , visited[i]1 1 0 1
st, i, mat[temp][i] , visited[i]1 2 1 0
st, i, mat[temp][i] , visited[i]1 3 1 0
st, i, mat[temp][i] , visited[i]1 4 1 0

st, i, mat[temp][i] , visited[i]1 1 1 1
st, i, mat[temp][i] , visited[i]1 2 0 1
st, i, mat[temp][i] , visited[i]1 3 0 1
st, i, mat[temp][i] , visited[i]1 4 1 1

st, i, mat[temp][i] , visited[i]1 1 1 1
st, i, mat[temp][i] , visited[i]1 2 0 1
st, i, mat[temp][i] , visited[i]1 3 0 1
st, i, mat[temp][i] , visited[i]1 4 1 1

st, i, mat[temp][i] , visited[i]1 1 1 1
st, i, mat[temp][i] , visited[i]1 2 1 1
st, i, mat[temp][i] , visited[i]1 3 1 1
st, i, mat[temp][i] , visited[i]1 4 0 1

 

 

 

/*baekjoon 1260 DFS,BFS*/
#include <bits/stdc++.h>
using namespace std;
#define MAXN ((int) 1e3) 

int N, M, V;//정점수,간선수,시작점 
int mat[MAXN+10][MAXN+10];
bool visited[MAXN+10];

void init(){
    for ( int i =0; i <= MAXN; i++) { visited[i] = 0;}
}
void DFS(int st){
    visited[st] = true;
    cout << st << " ";
    for (int i = 1; i <= N; i++) {
        if (mat[st][i] == 1 && visited[i] == false)
            DFS(i);
    }
}

void BFS(int st){
    queue<int> q;
    visited[st] = true;
    q.push(st);

    while(!q.empty()) {
        int temp = q.front();
        cout << temp << " ";
        q.pop();
        for (int i = 1; i <= N; i++) {
            if (mat[temp][i] == 1 && visited[i] == false){
                visited[i] = true;
                q.push(i);
            }
        }
    }

}
void InputData(){
    cin >> N >> M >> V;
    for( int i=0; i < M; i++){
        int x,y;
        cin >> x >> y;
        mat[x][y] = 1;
        mat[y][x] = 1;
    }
}
int main(){
    InputData();
    DFS(V);
    init();
    cout << endl;
    BFS(V);
    return 0;
}
/*baekjoon 1260 DFS,BFS*/
반응형

'Algorithm > BFS,DFS' 카테고리의 다른 글

[c++]백준 1012 유기농 배추  (0) 2021.04.24
[c++]백준 7576 토마토  (0) 2021.04.18
[c++]백준 2178 미로찾기  (0) 2021.04.18
[c++]baekjoon 2667 단지번호 붙이기  (0) 2021.04.14
[c++]baekjoon 2606(바이러스)  (0) 2021.04.14

+ Recent posts