제목 설명
아래는 성의 지형지도입니다. 도시 계산하는 프로그램을 작성 해주세요
훨씬 많은 객실이 있습니다 가장 큰 방을 포트를. 성 m × N (m≤50, n≤50) 조각들로 분할되고, 각 블록은 0 내지 4의 벽에서있을 수있다.
기입
첫 번째 줄은 두 개의 정수이며, 남북, 사각형의 동서 수 있습니다. 다음 입력 행에서, 각각의 블록 (0≤p≤50)은 숫자로 설명했다. 숫자 1 블록의 주위 벽을 나타내는 것은 서쪽 벽 (2), 북쪽을 나타내는 벽 동쪽 벽 4, 8 나타낸다 벽돌 벽을 나타냄. 숫자의 합의 주변 벽의 대표들과 각 상자가 표시. 성 내부가 두 번 계산되고, 남쪽 벽의 상자 (1,1)도 북쪽 벽의 블록 (2,1)입니다. 성 입력 데이터는 적어도 두 개의 객실을 보장합니다.
수출
성 객실의 수는 성 실의 가장 큰 수는 상자에 포함되어 있습니다. 각각의 행 번호 1은 그 결과를 표준 출력 장치에 표시된다.
샘플 입력
4
7
11 11 6 6 3 10 6
7 9 5 6 13 5 15
1 10 12 13 7 7 5
13 11 10 8 10 12 13
샘플 출력
5
9
문제 해결
이 ...... 1,2,3로 기록 제목의 깊은 검색, 우리는 다른 방을 표시하기 위해 착색 방법을 사용할 수 있습니다
노스 이스트 웨스트에서 검출되었으며, 먼저 모든 객실의 첫 방부터 시작하여 0으로 초기화된다 당신이 방을 포함하므로 재귀 구성 네 방향은, 이전의 방으로 수익을 검색 한 후, 벽이나 다른 방을 찾기 위해 계속 표시되었습니다 인접한 방을 발생할 경우 시계 방향으로는, 마크 여부를 확인하는 방법
방법은 0 0을 갖는 비트의 비트 단위 AND ()는 여기에 사용 된 방법에 따라 여부 이진 디지털 1,2,4,8 벽에 따라 결정될 수있다하고, 1은 완전한 1
0 0 = 0,0 및 1 = 0 및 1 = 1
마찬가지로, 이진수 1은 0001 (여기에 4을) 서쪽 벽이있는 경우, 그 첫 번째는, 다음 상관없이 나머지 세, 세 00001는 세 가지로 제한되어 있기 때문에 결과 일 수 있어야합니다 첫 번째 비트가 1 인 경우 0, 다음에 2,4,8 비트와 각각 마찬가지로 남동쪽 북쪽 다음, 서쪽 벽이 있어야합니다
전체 코드 아래에 첨부
#include<iostream>
#include<cstring>
using namespace std;
int s[52][52];
int color[52][52];
int maxroom,room,count;
void dfs(int a,int b)
{
if(color[a][b]) return;
color[a][b]=count;
room++;
if((s[a][b]&1)==0) dfs(a,b-1);
if((s[a][b]&2)==0) dfs(a-1,b);
if((s[a][b]&4)==0) dfs(a,b+1);
if((s[a][b]&8)==0) dfs(a+1,b);
}
int main()
{
int m,n,i,j;
while(cin>>m>>n)
{
count=0;
memset(color,0,sizeof(color));
maxroom=0,room=0;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
cin>>s[i][j];
}
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(!color[i][j])
{
count++;
room=0;
dfs(i,j);
maxroom=max(maxroom,room);
}
}
}
cout<<count<<endl<<maxroom<<endl;
}
return 0;
}
세포
제목 설명
0 1 내지 9이고, 셀 번호 9로 이루어진 숫자의 사각형 배열, 셀은, 수직 및 수평 세포 수에 따라 동일한 셀 또는 셀 번호로 정의 직사각형 배열에 필요한 세포의 수를 기록했다. 예를 들면 : 배열
410
0,234,500,067
1,034,560,500
2,045,600,671
0,000,000,089
4 개 개의 셀이 있습니다.
기입
입력의 첫 줄 두 정수 n 및 m (보다 크지 60) 및 n 개의 행 (공백없이 0-9 사이) 각각 m 입력 숫자
수출
출력 세포의 수를 나타내는 정수를
샘플 입력
4 10
0,234,500,067
1,034,560,500
2,045,600,671
0,000,000,089
샘플 출력
4
문제 해결
이 질문에 성 질문은 여전히 깊은 제목의 검색과 매우 유사 코드와 거의 동일 매우 유사입니다
몇 마디의 사람이 코드에 직접 말했다
#include<iostream>
#include<cstring>
using namespace std;
int s[61][61];
int count,m,n;//m行,n列
int color[61][61];
void dfs(int a,int b)
{
if(color[a][b]) return;
color[a][b]=count;
if(a>1&&s[a-1][b]!=0)
dfs(a-1,b);//上
if(b<n&&s[a][b+1]!=0)
dfs(a,b+1);//右
if(a<m&&s[a+1][b]!=0)
dfs(a+1,b);//下
if(b>1&&s[a][b-1]!=0)
dfs(a,b-1);//左
}
int main()
{
int i,j;
char str[62];
while(cin>>m>>n)
{
count=0;
memset(color,0,sizeof(color));
for(i=1;i<=m;i++)
{
cin>>str;
for(j=1;j<=n;j++)
s[i][j]=str[j-1]-'0';
}
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(s[i][j]!=0&&(!color[i][j]))
{
count++;
dfs(i,j);
}
}
}
cout<<count<<endl;
}
return 0;
}