블로그 이미지
shadowchaser
이곳 저곳 이것 저것

calendar

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

Notice

'Algorithm/DFS'에 해당되는 글 8

  1. 2016.08.25 정올 그래프 칠하기, 좋은 수열
  2. 2016.06.27 같은 모양 찾기
  3. 2016.06.22 DFS 정복!! 레벨 별
  4. 2016.06.18 예산 관리
  5. 2016.06.17 정올 더하기
  6. 2016.02.25 단지번호 붙이기 - 정올 1695번2
  7. 2016.02.16 NQueen - 정올 1889번
  8. 2016.02.14 단지번호 붙이기
2016. 8. 25. 00:19 Algorithm/DFS

#include <stdio.h>

/*

첫 줄에 노드 수 N(1≤N≤12)와 색상 번호 M(1≤M≤12)가 주어진다.

출력

노드1부터의 칠해진 색상 번호 리스트를 출력한다.

불가능한 경우 -1을 출력한다.

입력 예시

4 3

0

1 0

1 1 0

0 1 1 0

출력 예시

1 2 3 1

*/

 

// 그래프칠하기
#include <stdio.h>
/*
4 3
0
1 0
1 1 0
0 1 1 0
*/
int N;//노드수
int M;//색상번호
int SOL[14];
int MAP[14][14];
int RET;

int check( int V, int color) // V : 위치 , V : 색상
{
 int i;
 for (i = 1; i <= N; i++)
 {
  if (MAP[V][i] && SOL[i] == color) return 1; //인접한 정점에 같은 색이 이미 칠해져있는지 점검한다.
 }
 return 0;
}
int flag;
int dfs(int V)  // V: 접점
{
 if (V > N) {
  return 1;
 }
 int j;
 for (j = 1; j <= M; j++)
 {
  if (check(V, j) == 1) continue;
  SOL[V] = j;
  if (dfs(V + 1) == 1) return 1;
  SOL[V] = 0;
 }
 return 0;
}
int main(void)
{
 scanf("%d %d", &N, &M);
 int i, j , tmp;
 for (i = 1; i <= N; i++)
 {
  for (j = 1; j <= i; j++)
  {
   scanf("%d", &tmp);
   MAP[i][j] = MAP[j][i] = tmp;
  }
 }

 RET = dfs(1);
 if (RET)
 {
  for (i = 1; i <= N; i++)
  {
   printf("%d ", SOL[i]);
  }

 }
 else
 {
  printf("-1");
 }
 return 0;

}


한편  이 문제는 "좋은 수열" 문제와도 굉장히 유사하다.

#include <stdio.h>
  
int N;
char a[80+10];
  
int flag;
  
int strncmp(const char *s1, const char *s2, unsigned int n)
{
      while(n--)
      {
            if(*s1 > *s2) return 1;
            else if(*s1 < *s2) return -1;
            else if(*s1 == 0) return 0;
            s1++;
            s2++;
      }
      return 0;
}
  
int Check(int s)
{
      int i, cnt;
  
      if(s == 0) return 1;
      else
      {
            cnt = ++s / 2;
            for(i=1 ; i<=cnt ; i++)
            {
                  if(strncmp(&a[s-i], &a[s-i*2], i) == 0) return 0;
            }
      }
      return 1;
}
  
void DFS(int s)
{
      char i;
      if(s >= N)
      {
            flag = 1;
      }

      for(i='1' ; i<='3' ; i++)
      {
            a[s] = i; // 여기가 다르다.!! 그래프 칠하기의 경우 색상을 넣을지 말지를 확인하고 넣었으나, 여기에선 일단 넣고 될때 까지 돌린다.
            if(Check(s) == 0) continue;
            DFS(s+1);
            if(flag==1) return;
      }
}
  
int main(void)
{
      
      scanf("%d",&N);
      DFS(0);
      printf("%s", a);
  
      return 0;
}


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

같은 모양 찾기  (0) 2016.06.27
DFS 정복!! 레벨 별  (0) 2016.06.22
예산 관리  (0) 2016.06.18
정올 더하기  (0) 2016.06.17
단지번호 붙이기 - 정올 1695번  (2) 2016.02.25
posted by shadowchaser
2016. 6. 27. 23:41 Algorithm/DFS

#include <stdio.h>



int BIG;

int BIGMAP[110][110];

int SMALL;

int SMALLMAP[110][110];

int main(void)

{

freopen("1.txt", "r", stdin);

// 여기서부터 작성

scanf("%d", &BIG);

for (int i = 1; i <= BIG; i++)

for (int j = 1; j <= BIG; j++)

scanf("%1d", &BIGMAP[i][j]);

int count = 0;

scanf("%d", &SMALL);

for (int i = 0; i < SMALL; i++)

for (int j = 0; j < SMALL; j++)

scanf("%1d", &SMALLMAP[i][j]);

int dir;

int tmpcnt = 0;

for (int i = 1; i <= BIG - SMALL + 1; i++) {

for (int j = 1; j <= BIG - SMALL + 1; j++) {

for ( dir = 0; dir < 4; dir++)

{

for (int i = 0; i<SMALL / 2; i++) {

for (int j = i; j<SMALL - i - 1; j++) {

int tmp = SMALLMAP[i][j];

SMALLMAP[i][j] = SMALLMAP[j][SMALL - i - 1];

SMALLMAP[j][SMALL - i - 1] = SMALLMAP[SMALL - i - 1][SMALL - j - 1];

SMALLMAP[SMALL - i - 1][SMALL - j - 1] = SMALLMAP[SMALL - j - 1][i];

SMALLMAP[SMALL - j - 1][i] = tmp;

}

}

if (BIGMAP[i][j] == SMALLMAP[0][0])

{

int check = 1;

for (int x = 0; x < SMALL; x++) {

for (int y = 0; y < SMALL; y++) {

if (BIGMAP[i + x][j + y] != SMALLMAP[x][y])

{

//printf("==>[NOT MATCHED!] [dir:%d] i: %d j: %d -> x: %d, y: %d\n", dir, i, j, x, y);

check = 0;

}

else {

tmpcnt++;

//printf("==>[%d MATCHED, cnt:%d][dir:%d] i: %d j: %d -> x: %d, y: %d\n", tmpcnt, count, dir, i, j, x, y);

}

if (check == 0) {

break;

}

}

}

tmpcnt = 0;

if (check == 1)

count++;

}

}

}

}

printf("%d", count);

return 0;

}

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

정올 그래프 칠하기, 좋은 수열  (0) 2016.08.25
DFS 정복!! 레벨 별  (0) 2016.06.22
예산 관리  (0) 2016.06.18
정올 더하기  (0) 2016.06.17
단지번호 붙이기 - 정올 1695번  (2) 2016.02.25
posted by shadowchaser
2016. 6. 22. 03:39 Algorithm/DFS

이진 트리와 멀티 트리를 생각하면서 해보고,

관리해야할 항이 몇개인지 관리해보면 된다.

 

LV 1 예산관리

row도 필요없고, 걍 순서에서 값만 비교해보면 됨

#include <stdio.h>

int B/*예산*/, n/*개수*/, act[23], res;

void f(int i, int sum)  // i번활동, i-1까지의 합계

{

if (i == n + 1)

{

if (sum <= B && sum>res) //예산 보다는 작고 현재 값보다는 크면.

res = sum;

return;

}

f(i + 1, sum + act[i]); // i번째 활동을 포함하거나

f(i + 1, sum);         // 포함하지 않 거나

}

int main() {

int i;

scanf("%d %d", &B, &n);

for (i = 1; i <= n; i++)

scanf("%d", &act[i]);

f(1, 0);

printf("%d", res);

return 0;

}


LV 2 연구활동 가는길

flag를 두어 방문했던 곳을 한번만 가게 함

#include<stdio.h>

int n, m, G[11][11], sol = 0x7fffffff, chk[11];

void solve(int V, int W)

{

if (V == n)

{

if (W<sol) sol = W;

return;

}

for (int i = 1; i <= n; i++)

if (!chk[i] && G[V][i])

{

chk[i] = 1;

solve(i, W + G[V][i]);

chk[i] = 0;

}

}

int main(void)

{

scanf("%d %d", &n, &m);

for (int i = 0; i<m; i++)

{

int s, e, w;

scanf("%d %d %d", &s, &e, &w);

G[s][e] = G[e][s] = w;

}

solve(1, 0);

printf("%d\n", sol == 0x7fffffff ? ‐1 : sol);

return 0;

}


LV 3 해밀턴 순환 회로

flag를 두고, row도 두어 처리 함

#include<stdio.h>

int N;

int map[110][110];

int sol = 0x7fffffff;

int max = 0x7fffffff;

int chk[13];

void dfs(int V, int r,int cost)

{

if (cost >= sol) return;//만약 현재값이 ??

if (V >= N)

{

if (map[r][1] == 0) { 

return; 

}

cost += map[r][1];//비용 증가

if (cost < sol) sol = cost;

return;

}

for (int i = 2; i <= N; i++)

{

if (r == i) continue;

if (!chk[i] && map[r][i])//들러보지 않은 곳

{

chk[i] = 1;

dfs(V + 1, i, cost + map[r][i]);

chk[i] = 0;

}

}

}

void main()

{

freopen("input.txt", "r", stdin);

scanf("%d", &N);


for (int i = 1; i <= N; i++)

for (int j = 1; j <= N; j++)

{

scanf("%d", &map[i][j]);

}

dfs(1, 1, 0);

printf("%d", sol != max ? sol : 0);

}



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

정올 그래프 칠하기, 좋은 수열  (0) 2016.08.25
같은 모양 찾기  (0) 2016.06.27
예산 관리  (0) 2016.06.18
정올 더하기  (0) 2016.06.17
단지번호 붙이기 - 정올 1695번  (2) 2016.02.25
posted by shadowchaser
2016. 6. 18. 11:25 Algorithm/DFS

 

 정보 선생님은 예산이 많은 부서에서 일하고 있다. 학기말이 가까워지면서 부서의 예산을 가급적 모두 집행해야 될 상황이 되었다.
  정보 선생님은 예산 범위를 넘지 않는 선에서 다양한 활동을 하고 싶어 한다. 지금 남은 예산(B)이 40이고(단위:만원), 예산을 사용할 수 있는 활동(n)이 6개가 있다.
  6개의 활동에 각각 드는 비용은 7, 13, 17, 19, 29, 31이다. 여기서 40을 채울 수 있는 활동의 개수는 상관이 없다. 40을 넘지 않는 범위에서 활동 비용을 조합해보면,
                              7 + 13 + 17 = 37                             

                              7 + 31 = 38                             

                              7 + 13 + 19 = 39                            

                              ...
따라서 40을 초과하지 않으면서 예산을 최대로 사용할 수 있는 비용은 39이다. 정보 선생님을 도와 줄 수 있는 프로그램을 작성하시오.
입력  첫째 줄에 남은 예산(B)이 입력된다. ( 10 <= B <= 35,000 )  둘째 줄에 예산을 사용할 수 있는 활동의 수(n)가 입력된다. (1 <= n <= 21 )  셋째 줄에 공백을 기준으로 n개의 활동비가 양의 정수로 입력된다.
출력  남은 예산을 초과하지 않으면서 최대로 사용할 수 있는 비용액을 출력한다.
입력 예

40

6

7 13 17 19 29 31

출력 예  39

 

 

 

f(i, sum) = i번째 활동을 고려할 때, i-1까지 활동비용의 합계가 sum인 경우
#include <stdio.h>
int B/*예산*/, n/*개수*/, act[23], res;

void f(int i, int sum)  // i번활동, i-1까지의 합계

{   

if(i==n+1)   

{     

if(sum<=B && sum>res) //예산 보다는 작고 현재 값보다는 크면.

res=sum ;

return;

}

f(i+1, sum+act[i]); // i번째 활동을 포함하거나

f(i+1, sum);         // 포함하지 않 거나

}
int main() {

int i;

scanf("%d %d", &B, &n);

for(i=1; i<=n; i++)

scanf("%d", &act[i]);

f(1, 0);

printf("%d", res);

return 0;

}

 

배낭 문제(S)

f(i, r) = i~n번째 물건까지 고려했을 때, 남은 무게가 r인 가치의 최대 합
#include <stdio.h>
int W, n, i, j, w[102], v[102]; 
int max(int a, int b) {return a>b ? a:b;}
int f(int i/*물건번호*/, int r/*남은무게*/)

    if (i == n + 1)      
        return 0;  
    else if (r<w[i])     //만약 남은무게가 현재 물건크기보다 작다면.. 다음물건으로 진행
        return f(i + 1, r);  
    else     
        return max(f(i + 1, r), f(i + 1, r-w[i]) + v[i]);
}  


int main()
{
 scanf("%d %d", &n, &W);  
 for (i = 1; i <= n; i++)   
  scanf("%d%d", &w[i], &v[i]);  
 printf("%d", f(1, W));  
 return 0;
}

 

더하기

int T, N/*개수*/, K/*합계*/;

int d[20];

int sol;

int DFS(int x, int sum)

{

if (sum == K) return 1;

if (x >= N) return 0;

if (sum + d[x] <= K)

{

if (DFS(x + 1, sum + d[x]) == 1) return 1;

}

if (DFS(x + 1, sum) == 1) 

{ return 1; }

return 0;

}


int main(void)

{

freopen("input.txt", "r", stdin);

int i;


scanf("%d", &T);

while (T--)

{

scanf("%d %d", &N, &K);

for (i = 0; i<N; i++)

{

scanf("%d", &d[i]);

}


if (DFS(0, 0)) printf("YES\n");

else printf("NO\n");

}

return 0;

}

 

//등산로

#include <stdio.h>

int N;//산의크기(지도의크기)

int DY;//정상의세로위치

int DX;//정상의가로위치

int map[110][110];//산의정보

int D[110][110];//힘을계산해서갱신할배열

struct st {

int r, c;//r:세로위치, c:가로위치

};

#define MAXQ (110*110*10)

#define INF (0x7FFFFFFF)

struct st queue[MAXQ];

int wp, rp;

int In_Queue(int r, int c) {

if (wp >= MAXQ) return 0;//저장실패

queue[wp].r = r;

queue[wp++].c = c;

return 1;//성공

}

int Out_Queue(struct st *p) {

if (wp == rp) return 0;//읽기실패

*p = queue[rp++];

return 1;//성공

}

int BFS(void) {

int rr[] = { -1, 1, 0, 0 };

int cc[] = { 0, 0, -1, 1 };

int i, j, temp, r, c;

struct st p;

//D배열INF값으로초기화, 시작위치를큐에저장

for (i = 0; i<N + 2; i++) {//세로

for (j = 0; j<N + 2; j++) {//가로

if ((i == 0) || (j == 0) || (i == N + 1) || (j == N + 1)) {

In_Queue(i, j);

D[i][j] = 0;

}

else D[i][j] = INF;

}

}

while (Out_Queue(&p)) {

for (i = 0; i<4; i++) {

r = p.r + rr[i];//p.r은현재위치, r은이동할위치

c = p.c + cc[i];//p.c는현재위치, c는이동할위치

if ((r>0) && (c>0) && (r<N + 1) && (c<N + 1)) {//이동가능

temp = map[p.r][p.c] - map[r][c];//현재위치높이- 이동할위치의높이

if (temp < 0) temp *= temp; //오르막길(차의제곱만큼힘이듦)

temp += D[p.r][p.c];

if (D[r][c] > temp) {//기존보다힘이적게들때만갱신

D[r][c] = temp;

In_Queue(r, c);

}

}

}

}

return D[DY][DX];

}

int main(void) {

int i, j, sol;

scanf("%d", &N);

scanf("%d %d", &DY, &DX);

for (i = 1; i <= N; i++) {

for (j = 1; j <= N; j++) {

scanf("%d", &map[i][j]);

}

}

sol = BFS();

printf("%d\n", sol);

return 0;

}

//영역구하기

typedef struct {

int sX;

int sY;

int eX;

int eY;

} _pos;

_pos POS[1000];

int map[100][100] = { 0, };

int nCount = 0;

int nArea = 0;

int Area[100] = { 0, };

int sero;

int garo;

int idx = -1;

void find(int se, int ga)

{

nCount++;

if (se - 1 >= 0 && map[se - 1][ga] == 0) 

{

map[se - 1][ga] = idx;

find(se - 1, ga); 

}

if (se + 1 < sero && map[se + 1][ga] == 0)

map[se + 1][ga] = idx; 

find(se + 1, ga); 

}

if (ga - 1 >= 0 && map[se][ga - 1] == 0) 

map[se][ga - 1] = idx; 

find(se, ga - 1); 

}

if (ga + 1 < garo && map[se][ga + 1] == 0)

map[se][ga + 1] = idx;

find(se, ga + 1); 

}


//int Dy[] = { 1, 0,0, -1 };

//int Dx[] = { 0,-1, 1, 0 };

//nArea++;

//int head = 0;

//int tail = 1;

//while (1)

//{

// for (int x = 0; x < 4; x++)

// {

// int tmpX = garo + Dx[x];

// int tmpY = sero + Dy[x];

// if (map[tmpY][tmpX] == 0)

// {

// map[tmpY][tmpX] == -1;

// nCount++;

// }

// }

//}

}

void main()

{

int count;

// freopen("input.txt", "r", stdin);

scanf("%d %d %d", &sero, &garo, &count);


for (int i = 0; i < count; i++)

{

scanf("%d %d %d %d", &POS[i].sX, &POS[i].sY, &POS[i].eX, &POS[i].eY);

int tmpX = POS[i].eX - POS[i].sX;

int tmpY = POS[i].eY - POS[i].sY;

for (int y = POS[i].sY; y < tmpY + POS[i].sY; y++)

{

for (int x = POS[i].sX; x < tmpX + POS[i].sX; x++)

{

map[y][x]++;

}

}

}


for (int i = 0; i< sero; i++)

{

for (int j = 0; j < garo; j++)

{

if (map[i][j] == 0)

{

map[i][j] = --idx;

find(i, j);

Area[nArea++] = nCount;

nCount = 0;

}

}

}

for (int i = 0; i < nArea-1; i++)

{

for (int j = 0; j < nArea - 1 -i; j++)

{

if (Area[j] > Area[j + 1])

{

int tmp = Area[j];

Area[j] = Area[j + 1];

Area[j + 1] = tmp;

}

}

}

printf("%d\n", nArea);

for (int i = 0; i < nArea; i++)

{

printf("%d ", Area[i]);

}

}

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

같은 모양 찾기  (0) 2016.06.27
DFS 정복!! 레벨 별  (0) 2016.06.22
정올 더하기  (0) 2016.06.17
단지번호 붙이기 - 정올 1695번  (2) 2016.02.25
NQueen - 정올 1889번  (0) 2016.02.16
posted by shadowchaser
2016. 6. 17. 00:37 Algorithm/DFS

#include<stdio.h>

/*

덧셈을 못하는 철수를 공부시키기 위해 자연수들을 주고, 그 중에 몇 개의 수를 골라서 그 합이 K가 될 수 있는지 알아보라고 시켰다.

철수 어머니가 자연수들을 무작위로 선택해서 본인도 가능한지 아닌지 모르고 있다. 어머니가 채점을 할 수 있게 주어진 문제의 답을 찾아주자.


번째 줄에 테스트 케이스 개수 T(1≤T≤10)가 주어진다.

두 번째 줄부터 아래 내용이 T개 만큼 주어진다.

첫 줄에 자연수 개수 N(5 <= N <= 20)과 K(1 <= K <= 2,000,000)가 공백으로 구분되어 입력된다.

다음 줄에 N개의 자연수 di(1 <= di <= 100,000)가 공백으로 구분되어 입력된다.


T줄에 걸쳐 각 테스트 케이스 별로 주어진 자연수 중 몇 개의 합이 K가 되면 “YES”를 아니면 “NO”를 출력한다.



입력 예시

2

5 19

1 2 4 7 10

5 25

1 2 4 7 10

출력 예시

YES

*/

#include<stdio.h>

int T;

int N;

int CNT;

int GOAL;

int num[100001];

int dfs(int pos, int cost)

{

if (cost > GOAL) return 0;

if (cost == GOAL) return 1;


for (int i = pos; i < N; i++) // 다중트리

{

if (dfs(i + 1, cost + num[i]) == 1) return 1;

}

return 0;


}

int dfs(int pos, int cost)

{

if (pos > cntN)  return 0;

if (cost > GOAL) return 0;

if (cost == GOAL) return 1;



if (dfs(pos + 1, cost + arr[pos]) == 1) return 1; // 이진트리

if ( dfs(pos + 1, cost )==1) return 1;


}

void main()

{

scanf("%d", &T);

while (T--)

{

scanf("%d %d", &N, &GOAL);

for (int i = 0; i < N; i++)

{

scanf("%d", &num[i]);

}

printf("%s\n", dfs(0, 0) == 1 ? "YES" : "NO");

}

}

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

DFS 정복!! 레벨 별  (0) 2016.06.22
예산 관리  (0) 2016.06.18
단지번호 붙이기 - 정올 1695번  (2) 2016.02.25
NQueen - 정올 1889번  (0) 2016.02.16
단지번호 붙이기  (0) 2016.02.14
posted by shadowchaser
2016. 2. 25. 00:26 Algorithm/DFS

전형적인 DFS인 단지번호 붙이기는 DFS 로직만 알고 있다면 쉽게 접근할 수 있다.

단지번호 붙이기는 그냥 숫자만 올리고, 정렬하는 것만 유의하면 된다.


특히 bubble sort를 진행할 때 어떤 블로그들에선 완전히 잘못된 내용으로 접근하는 경우가 있다. 비교를 정말 쓸데 없는 부분까지 하는경우가 있는데,


https://ko.wikipedia.org/wiki/%EA%B1%B0%ED%92%88_%EC%A0%95%EB%A0%AC에 나와있는 바처럼 짧게 기술할 수 있다.


암튼 결론은 버킹검



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

DFS 정복!! 레벨 별  (0) 2016.06.22
예산 관리  (0) 2016.06.18
정올 더하기  (0) 2016.06.17
NQueen - 정올 1889번  (0) 2016.02.16
단지번호 붙이기  (0) 2016.02.14
posted by shadowchaser
2016. 2. 16. 00:18 Algorithm/DFS

정올 1889번 NQueen문제의 답

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=1162&sca=3030

backtracking을 활용한 것이다.

backtracking이란.. dfs를 통해 구현하는 중에 가지치기를 진행하는 수법이라고 한다.


#include <stdio.h>

#include <stdlib.h> //abs 함수를 사용하기 위해서임


int promising(int); // 할만한지 안한지 체크하는 함수. 

int n;

int col[255] = { 0, }; // 행에 놓이는 값. 예를 들어 col[1] = 5라면 2번째 에는 5번째에 있다는 내용임

int cnt =0; // 해결되는 값


void queens(int i) {

if (promising(i))

{

if (i == n)

{

cnt++; // 총 개수를 구함

}

else

{

for (int j = 1; j <= n; j++) {

col[i + 1] = j;

queens(i + 1);

}

}

}

}


int promising(int i) { // 직선, 대각선으로 만나는지 검사

int k = 1, promising = 1;

while (k < i && promising) {

if (col[i] == col[k] || abs(col[i] - col[k]) == abs(i - k)) //직선이나 대각선상에 있는가를 검사

{

promising = 0;

}

k++;

}

return promising;

}


int main() {

scanf("%d", &n);

queens(0);

printf("%d", cnt);

}



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

DFS 정복!! 레벨 별  (0) 2016.06.22
예산 관리  (0) 2016.06.18
정올 더하기  (0) 2016.06.17
단지번호 붙이기 - 정올 1695번  (2) 2016.02.25
단지번호 붙이기  (0) 2016.02.14
posted by shadowchaser
2016. 2. 14. 23:28 Algorithm/DFS

단지번호 붙이기


#include <stdio.h>


/*

7

0 1 1 0 1 0 0

0 1 1 0 1 0 1

1 1 1 0 1 0 1

0 0 0 0 1 1 1

0 1 0 0 0 0 0 

0 1 1 1 1 1 0

0 1 1 1 0 0 0


*/

#include<stdio.h>


int N;

int map[100][100] = { 0, };

void dfs(int sero, int garo, int cnt)

{

map[sero][garo] = cnt;

if (sero - 1 >= 0 && map[sero - 1][garo] == 1) { 

dfs(sero - 1, garo, cnt); }

if (sero + 1 < N && map[sero + 1][garo] == 1) { 

dfs(sero + 1, garo, cnt); }

if (garo - 1 >= 0 && map[sero][garo - 1] == 1) { 

dfs(sero, garo - 1, cnt); }

if (garo + 1 < N && map[sero][garo + 1] == 1) { 

dfs(sero, garo + 1, cnt); }

}

void main()

{

freopen("input.txt", "r", stdin);

scanf("%d", &N);

for (int i = 0; i < N; i++)

{

for (int j = 0; j < N; j++)

{

scanf("%1d", &map[i][j]);

}

}


int cnt = 1;

for (int i = 0; i < N; i++)

{

for (int j = 0; j < N; j++)

{

if (map[i][j] == 1)

{

cnt++;

dfs(i, j, cnt);

}

}

}


int Area[100] = { 0, };

int tmp = cnt - 1;

int k = 2;

for (int i = 0; i<N; i++)

{

for (int j = 0; j<N; j++)

{

if (map[i][j])

{

Area[map[i][j] - 2]++;

}

}

}

for (int i = 0; i< cnt -2; i++)

{

for (int j = 0; j< cnt-2-i; j++)

{

if (Area[j] > Area[j + 1])

{

int tmp = Area[j + 1];

Area[j + 1] = Area[j];

Area[j] = tmp;

}

}

}

printf("%d\n", cnt-1);

for (int i = 0; i < cnt - 1; i++)

{

printf("%d\n", Area[i]);

}

}

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

DFS 정복!! 레벨 별  (0) 2016.06.22
예산 관리  (0) 2016.06.18
정올 더하기  (0) 2016.06.17
단지번호 붙이기 - 정올 1695번  (2) 2016.02.25
NQueen - 정올 1889번  (0) 2016.02.16
posted by shadowchaser
prev 1 next