평신도의 언어 학습 알고리즘에서 평신도의 언어로 118- 문제 성, 알고리즘에게 113 ~ 셀을 학습

제목 설명

아래는 성의 지형지도입니다. 도시 계산하는 프로그램을 작성 해주세요
훨씬 많은 객실이 있습니다 가장 큰 방을 포트를. 성 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;
}
게시 37 개 원래 기사 · 원의 찬양 3 · 조회수 1159

추천

출처blog.csdn.net/qq_45721778/article/details/105397386