성 문제 (DFS)
4723 단어 검색 (BFS) (DFS)알고리즘
총 시간 제한: 1000 ms 메모리 제한: 65536 kB
묘사 하 다. (그림 1)
# = Wall | = No wall - = No wall
그림 1 은 성의 지형도 이다.성 이 모두 몇 개의 방 이 있 는 지, 가장 큰 방 이 얼마나 큰 지 계산 하 는 프로그램 을 만들어 보 세 요.성 은 m * n (m ≤ 50, n ≤ 50) 개의 사각형 으로 분할 되 어 있 으 며, 각 사각형 은 0 ~ 4 면 벽 이 있 을 수 있다.
입력 프로그램 이 표준 입력 장치 에서 데 이 터 를 읽 습 니 다.첫 줄 은 두 개의 정수 로 각각 남북 방향, 동서 방향의 사각형 이다.다음 입력 줄 에서 각 사각형 은 하나의 숫자 (0 ≤ p ≤ 50) 로 설명 합 니 다.하나의 숫자 로 사각형 주위 의 벽 을 표시 하고, 1 은 서쪽 벽 을 표시 하고, 2 는 북쪽 벽 을 표시 하 며, 4 는 동쪽 벽 을 표시 하고, 8 은 남쪽 벽 을 표시 한다.각 사각형 은 그 주위 의 벽 을 대표 하 는 숫자의 합 으로 표시 한다.성의 내 벽 은 두 번 계산 되 고 사각형 (1, 1) 의 남 벽 은 사각형 (2, 1) 의 북 벽 이기 도 하 다.입력 한 데 이 터 는 성 안에 적어도 두 개의 방 이 있다 는 것 을 보증 합 니 다.
출력 성의 방 수, 성의 최대 방 에 포 함 된 사각형 수.결 과 는 표준 출력 장치 에 표 시 됩 니 다.
샘플 입력 4 7 11 6 11 6 3 10 6 7 9 6 13 5 15 5 1 10 12 7 13 7 5 13 11 10 8 10 12 13
샘플 출력 5 9
예: 11 의 이 진 은 1011 이 고 각 이 진 은 각각 '남 벽', '동 벽', '북 벽', '서 벽' 을 나타 내 며 1 은 벽 이 있 음 을 나타 내 고 0 은 벽 이 없다 는 것 을 나타 낸다.비트 와 연산 자 & 의 사용: 예 를 들 어 11 & 4 < = > 1011 & 0100 = 0000 = 0.같은 것 은 1 이 고, 다른 것 은 0 이다.세로: 1011 &0100 ----- 0000
문제 풀이 방향: 각 사각형, 깊이 우선 검색 (DFS) 을 통 해 이 사각형 이 도달 할 수 있 는 모든 위치 에 염색 합 니 다.마지막 으로 총 몇 가지 색깔 과 각 색깔 의 수량 을 통계 해 냈 다.예 를 들 어 1, 2, 3, 3, 1, 1, 2, 3, 4, 1, 1, 5, 3, 1, 5, 5, 5, 5, 5, 5, 5, 5, 3. 모두 5 개의 방 이 있 고 가장 큰 방 (1) 은 9 개의 칸 을 차지한다.
[해법 1: 귀속]
[해법 2: 스 택]
/ * 이것 은 BFS 템 플 릿 을 모방 한 표기 법 입 니 다. O (∩ ∩) O 하하 ~, 이제 야 BFS 와 DFS (스 택 해법) 의 차 이 를 알 게 되 었 습 니 다. 사실 BFS 템 플 릿 을 사용 하면 DFS 를 실현 할 수 있 습 니 다. 스 택 으로 쓴 DFS 와 대열 로 쓴 BFS 는 조금 다 릅 니 다. 그것 이 바로 그들 이 사용 하 는 데이터 구조 가 다 릅 니 다.이 두 가지 서로 다른 데이터 구조의 서로 다른 특성 때문에 심층 검색 과 광 검색 효과 가 다 릅 니 다. * * * * * * *스 택 은 후진 이 먼저 나 옵 니 다. 그래서 매번 에 처음으로 광 수 와 같이 읽 을 수 있 는 첫 번 째 단계 에서 갈 수 있 는 노드 를 찾 습 니 다. 그 다음 에 스 택 요 소 를 기점 으로 이 점 에서 한 걸음 에 도착 할 수 있 는 노드 를 아래로 찾 습 니 다. 그러나 매번 에 조회 하 는 요 소 는 모두 이번에 옮 겨 다 니 는 마지막 요소 입 니 다. 즉, 두 번 째 조 회 는 모두 출발점 에서 도착 할 수 있 는 다음 요소 입 니 다. * * * * * * * * * * * * * * * * * *대기 열 은 먼저 나 가 고 매번 에 처음으로 읽 을 수 있 는 첫 번 째 단계 가 걸 을 수 있 는 노드 입 니 다. 그 다음 에 팀 의 첫 번 째 요 소 를 기점 으로 이 점 에서 한 걸음 에 도착 할 수 있 는 노드 를 찾 습 니 다. 그러나 매번 조회 할 때 한 요 소 를 먼저 조회 합 니 다. 이 층 이 끝 날 때 까지 다음 층 을 찾 습 니 다. 윗 층 요 소 는 항상 먼저 들 어 갑 니 다 * /
//AC
#include
#include
#include
using namespace std;
int R,C; //
int rooms[60][60];
int color[60][60]; //
int maxRoomArea=0,roomNum=0;
int roomArea;
// :
void Dfs(int i,int k)
{
if (color[i][k])
return ;
++roomArea;
color[i][k]=roomNum;
if ((rooms[i][k]&1)==0)
Dfs(i,k-1); //
if ((rooms[i][k]&2)==0)
Dfs(i-1,k); //
if ((rooms[i][k]&4)==0)
Dfs(i,k+1); //
if ((rooms[i][k]&8)==0)
Dfs(i+1,k); //
}
int main()
{
cin>>R>>C;
for (int i=1;i<=R;i++)
for (int k=1;k<=C;k++)
cin>>rooms[i][k];
memset(color,0,sizeof(color));
for (int i=1;i<=R;i++)
{
for (int k=1;k<=C;k++)
{
if (!color[i][k])
{
++roomNum;
roomArea=0;
Dfs(i,k);
maxRoomArea=max(roomArea,maxRoomArea);
}
}
}
cout<
[해법 3: 사실 이것 도 스 택 으로 해결 한 것 입 니 다. 안에 사 용 된 구조 체 내의 구조 함수 일 뿐 두 개의 구조 체 변수 가 아 닙 니 다.]
//AC
#include
#include
#include
using namespace std;
int mark[60][60];
int room[60][60];
int n,m,num=0,area,maxarea;
struct data
{
int x,y;
};
void dfs(int x,int y)
{
stack stk;
data p,pp;
p.x=x;
p.y=y;
stk.push(p);
while (!stk.empty())
{
p=stk.top();
if (mark[p.x][p.y])
stk.pop();
else
{
++area;
mark[p.x][p.y]=1;
if ((room[p.x][p.y]&1)==0&&p.y>0&&!mark[p.x][p.y-1])
{
pp.x=p.x;
pp.y=p.y-1;
stk.push(pp);
}
if ((room[p.x][p.y]&2)==0&&p.x>0&&!mark[p.x-1][p.y])
{
pp.x=p.x-1;
pp.y=p.y;
stk.push(pp);
}
if ((room[p.x][p.y]&4)==0&&p.y+1maxarea)
maxarea=area;
}
}
}
printf("%d
%d
",num,maxarea);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【JavaScript】 볼록함 그라함 스캔을 구현, 애니메이션화한다! ? 【canvas】볼록포를 시각화해 본다. — s-yoshiki | 스크립트 카스 (@s_yoshiki_dev) JavaScript에서 그레이엄 스캔에 의해 정렬되어 가는 애니메이션을 구현했다. 아래쪽에서 데모로 소개. 참고 Java...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.