블로그 이미지
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

Notice

2016. 8. 20. 08:18 Algorithm

/*

4 3 3

1 1

3 3

4 1

*/

#include <stdio.h>

#define ABS(t) ((t)<0?-(t):(t))

#define MAX(a,b) ((a)>(b)?(a):(b))

int W, H, N;//가로, 세로크기, 데이타개수

int x[1010], y[1010];

int min;

int main(void)

{

int i;

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

scanf("%d %d %d", &W, &H, &N);

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

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

}

int cnt = 0, sx, sy, xdis, ydis;

sx = x[0], sy = y[0];

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

xdis = sx - x[i];

ydis = sy - y[i];

if (xdis * ydis >= 0) cnt += MAX(ABS(xdis), ABS(ydis));

else cnt += ABS(xdis) + ABS(ydis);

sx = x[i], sy = y[i];

}

printf("%d", cnt);


return 0;

}//

'Algorithm' 카테고리의 다른 글

바이너리서치를 통한 정올 예산  (0) 2016.08.20
에라토스테네스의 체 (소수 구하기)  (0) 2016.06.23
posted by shadowchaser
2016. 8. 20. 08:14 Algorithm


/*

국가의 역할 중 하나는 여러 지방의 예산요청을 심사하여 국가의 예산을 분배하는 것이다. 국가예산의 총액은 미리 정해져 있어서 모든 예산요청을 배정해 주기는 어려울 수도 있다. 그래서 정해진 총액 이하에서 가능한 한 최대의 총 예산을 다음과 같은 방법으로 배정한다.
 
(1) 모든 요청이 배정될 수 있는 경우에는 요청한 금액을 그대로 배정한다.
(2) 모든 요청이 배정될 수 없는 경우에는 특정한 정수 상한액을 계산하여 그 이상인 예산요청에는 모두 상한액을 배정한다. 상한액 이하의 예산요청에 대해서는 요청한 금액을 그대로 배정한다.
 
예를 들어, 전체 국가예산이 485이고 4개 지방의 예산요청이 각각 120, 110, 140, 150이라고 하자. 이 경우, 상한액을 127로 잡으면, 위의 요청들에 대해서 각각 120, 110, 127, 127을 배정하고 그 합이 484로 가능한 최대가 된다.
 
여러 지방의 예산요청과 국가예산의 총액이 주어졌을 때, 위의 조건을 모두 만족하도록 예산을 배정하는 프로그램을 작성하시오.


예제)

입력 예시

4

120 110 140 150

485

출력 예시

127

입력 예시

5

70 80 30 40 100

450

출력 예시 

100

*/


#include<stdio.h>

int N, M;

int a[10000 + 10];

int check(int m) {

int i, sum = 0;

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

{

sum += MIN(a[i], m);

}

if (sum <= M)    return 1;

return 0;

}

int main(void) {

int i, sol, s, e, m, sum = 0, max = 0;

scanf("%d", &N);

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

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

sum += a[i];

if (a[i]>max) max = a[i];

}

scanf("%d", &M);

if (sum <= M) printf("%d", max);

else {

s = 0;

e = max;

while (s <= e) {

m = (s + e) / 2;

if (check(m) == 1) {

sol = m;

s = m + 1;

}

else e = m - 1;

}

printf("%d", sol);

}


return 0;


}

'Algorithm' 카테고리의 다른 글

절대값 MAX 매크로  (0) 2016.08.20
에라토스테네스의 체 (소수 구하기)  (0) 2016.06.23
posted by shadowchaser
2016. 8. 6. 00:07 Algorithm/기본 이론


'Algorithm > 기본 이론' 카테고리의 다른 글

정올 지하철  (0) 2016.07.23
공부 순서  (0) 2016.06.13
bubble sort  (0) 2016.03.12
default  (0) 2016.02.27
posted by shadowchaser
2016. 7. 23. 01:24 Algorithm/기본 이론
floyd warshall인가.. 이게 중요함. 느려도 이거 쓰면 편하게 구할 수 있음.


#include<stdio.h>
 
int s[110][110], p[110][110], n, m;
void path(int s, int e)
{
    if (p[s][e] == 0)  return;
    path(s, p[s][e]);
    printf("%d ", p[s][e]);
    path(p[s][e], e);
}
 
int main()
{
 
    /*
    5 5
    0 2 2 5 9
    2 0 3 4 8
    2 3 0 7 6
    5 4 7 0 5
    9 5 6 5 0
    */
    int i, j, k;
    scanf("%d %d", &n, &m);
    for (i = 1; i <= n; i++){
        for (j = 1; j <= n; j++) {
            scanf("%d", &s[i][j]);
        }
    }  
 
    for (k = 1; k <= n; k++) {
        for (i = 1; i <= n; i++) {
            for (j = 1; j <= n; j++) {
                if (s[i][j] > s[i][k] + s[k][j]) {
                    s[i][j] = s[i][k] + s[k][j];
                    p[i][j] = k;
                }
            }
        }
    }
    printf("%d\n", s[1][m]);
    printf("1 ");
    path(1, m);
    printf("%d ", m);
    return 0;
}


'Algorithm > 기본 이론' 카테고리의 다른 글

순열, 중복순열, 조합, 중복조합  (0) 2016.08.06
공부 순서  (0) 2016.06.13
bubble sort  (0) 2016.03.12
default  (0) 2016.02.27
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. 25. 00:47 Algorithm/Backtracking

기본적으로 풀기 어려우면 무조건 부분집합 돌려서 각 값을 대입해서 최대 최소값 구하고 본다. 그러면 중간이라도 간다.

#include <stdio.h>

int data[]={1,2,3,4};
int flag[]={0,0,0,0};

void powerset(int n,int depth)
{
    if(n==depth){
        int i;
        printf("{");
        for(i=0;i<n;i++){
            if(flag[i]==1)printf("%d ",data[i]);
        }
        printf("}\n");
        return;
    }
    flag[depth]=1;
    powerset(n,depth+1);
    flag[depth]=0;
    powerset(n,depth+1);
}

int main()
{
    powerset(sizeof(data)/sizeof(int),0);
    return 0;    
}



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

정올 해밀턴 순환 회로  (0) 2016.06.22
정올 영역구하기  (0) 2016.06.13
posted by shadowchaser
2016. 6. 23. 00:23 Algorithm

소수를 구하는 방법중엔 에라토스테네스의 체 방법이 꽤 효과적이다.

어차피 알고리즘 문제에서도 에라토스테네스의 체 를 응용한 문제가 더 많이 나올 테니 이것을 응용하는게 더 좋음.(TC가 많아도 일단 한번 다 저장하면 장땡이기 때문)

#include<stdio.h>


int N;

int arr[10001];

void prime(int num)

{

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

{

arr[i] = i;

}

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

{

if (arr[i] == 0) continue; // 이미 체크된 수의 배수는 skip (이거 지우면 엄청 오래걸림)

for (int j = 2; j <= num; j++)

{

if (arr[j] != i && arr[j] % i == 0){

arr[j] = 0;

}

}

}

}

void main()

{

scanf("%d", &N);

prime(N);

}


그! 런! 데!!!이 방법이 더 좋다. 무조건 이 아래방법을 써야한다.!!!

예를 들어 10000까지의 소수를 구하려한다면, 아래 공식으로 써야한다. 100이라고 쓴 거 잘못쓴거 아님!

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

{

if (prime[i] == 0) {

for (int j = i*i; j < 10000; j++)

{

prime[j] = 1;

}

}

}

}

'Algorithm' 카테고리의 다른 글

절대값 MAX 매크로  (0) 2016.08.20
바이너리서치를 통한 정올 예산  (0) 2016.08.20
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. 22. 02:39 Algorithm/Backtracking


태현이는 방학기간 동안 택배 알바를 해서 최고급 노트북을 장만하려고 한다.

오늘 배달해야 하는 장소를 한 번씩만 방문해서 물건을 모두 배달하고 다시 회사로 돌아와야 한다배달하는 장소에만 도착할 수 있다면 물건은 모두 배달할 수 있으므로 물건의 개수나 크기등은 고려하지 않아도 된다.

 

그런데 문제는 방문하는 순서를 어떻게 정할지가 고민이다어떤 장소에서 다른 장소로 이동하는 데에는 비용이 발생하는데 만약 방문하는 순서를 잘못 정하게 되면 알바비로 받은 돈을 모두 이동비용으로 사용하고 눈물을 흘릴지도 모른다.

태현이가 물건을 모두 배달하고 회사로 돌아오기 위한 최소의 비용을 계산하는 프로그램을 작성해 주자.

 

첫 줄은 배달해야 하는 장소의 수 N(1≤N≤12)이 주어진다. 이때, 출발지(회사)는 1번이다. 

둘째 줄은 N X N 크기의 장소와 장소를 이동하는 비용(0 ≤ 비용< 100)이 한 칸씩의 공백으로 구분하여 주어진다. 비용은 양방향이 아니라 단방향으로 가기 위한 비용이다. 예들 들어 첫 번째 행 두 번째 열에 적힌 비용은 1번 장소에서 2번 장소로 이동하기 위한 비용을 의미하며, 2번 장소에서 1번 장소로 이동하기 위한 비용은 두 번째 행 첫 번째 열에 주어진다.
장소 사이에 이동할 수 있는 방법이 없다면 비용을 0으로 표시한다.



회사에서 출발하여 오늘 배달해야 하는 모든 장소를 한 번씩 들러 물건을 배달하고 회사에 돌아오기 위한 최소의 비용을 출력한다.


 [Copy]
5 
0 14 4 10 20 
14 0 7 8 7 
4 5 0 7 16 
11 7 9 0 2 
18 7 17 4 0
 [Copy]
30


테스트 코드를 이 배열로하면 문제가 별 안보이지만, 아래아래 6짜리로 하면 예외 케이스를 확인할 수 있다. 이것만 유의하면 문제 없음

예산관리와 유의하여 볼 것.

0 14 4 10 20 

14 0 7 8 7 

4 5 0 7 16 

11 7 9 0 2 

18 7 17 4 0

이 배열로하면, 


6

0 93 23 32 39 46 

0 0 7 58 59 13 

40 98 0 14 33 98 

3 39 0 0 13 16 

51 25 19 88 0 47 

65 81 63 0 6 0 



#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) // V는 접점의 개수를 counting, r은 각 들어갈 열, cost는 총 비용

{

if (cost >= sol) return; //만약 현재값이 sol보다 커버리면 아무의미 없으니까 skip

if (V >= N)

{

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

return; /* 1로 돌아갈때, 돌아올 수 못한 다는 것을 의미 */

}

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

if (cost < sol) sol = cost;

return;

}

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

{

if (r == i) continue;//똑같은 곳에서 똑같은 곳으로 갈일은 없으니 skip

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 > Backtracking' 카테고리의 다른 글

부분집합구하기  (0) 2016.06.25
정올 영역구하기  (0) 2016.06.13
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
prev 1 ··· 3 4 5 6 7 8 9 10 next