'Studies/Programming Challenges (알고리즘 트레이닝 북)'에 해당되는 글 2건

  1. 2008.08.20 문제 2. 지뢰 찾기 (Mine sweeper)
  2. 2008.08.12 문제 1. 3n+1 문제(The 3n+1 Problem)

// Written by rinehart

// rinehart@naver.com

//2007. 6. 8

/* Note :  This code will be better if get map text from file. (I'm lazy...)

Maybe, some part of main function need to seperate to another functions */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAP_MAX 100
#define Type_New_map    1
#define Type_Read_map  2
#define Type_Exit               3


int Get_String(char *input_buf, int *m, int *n);


int Get_Result(char **map, char **result, int m, int n);


int Print_Result(char** result, int m, int n);


int Set_Mark(char* target);


int main()
{
        char buf[MAP_MAX];       
        char **map;
        char **result;
        int m = 0, n = 0, line_counter = -1;
        int Type = 0;
        int loop;

        while (1)
        {
                Type = Get_String(buf, &m, &n);

                if (Type == Type_Exit)
                        break;
                else if (Type == Type_New_map)
                {
                        map = malloc(sizeof(char*) * m);
                        result= malloc(sizeof(char*)*m);
                       
                        for (loop = 0; loop < m; loop++)
                        {
                                map[loop] = malloc(sizeof(int*)*n);
                                result[loop] = malloc(sizeof(char*)*n);
                        }
                               
                        line_counter = 0;
                }
               
                for (loop = 0; loop < n; loop++)
                {
                        Type = Get_String(buf, &m, &n);
                        if (line_counter >= m)
                        {
                                // Get the Result
                                m = 0;               
                        }
                        else
                        {
                                strcpy(map[line_counter], buf);
                                line_counter++;               
                        }
                }

                Get_Result(map, result, m, n);
                Print_Result(result, m, n);
        }
       
        printf ("\nEnd of Program\n");
       
        return 0;
}


int Get_String(char *a_buf, int *m, int *n)
{
        int result_Type = Type_New_map;
        int t_m, t_n;
        char *token;

        memset (a_buf, 0x00, sizeof(a_buf));
        gets(a_buf);

        if (a_buf[0] == '.' || a_buf[0] == '*')
        {
                result_Type = Type_Read_map;
        }
        else
        {
                token = strtok(a_buf, " \n");
                t_m = atoi(token);
                token = strtok(NULL, " \n");
                t_n = atoi(token);
                if(t_m ==0 && t_n == 0)
                        result_Type = Type_Exit;
                else
                {
                        *m = t_m;
                        *n = t_n;
                        result_Type = Type_New_map;
                }
        }

        return result_Type;
}


int Get_Result(char **map, char **result, int m, int n)
{
        int loop1, loop2;

        for (loop1 = 0; loop1 < m; loop1++)
        {
                for (loop2 = 0; loop2 < n; loop2++)
                {
                        result[loop1][loop2] = '0';
                }
        }

       
        for (loop1 = 0; loop1 < m; loop1++)
        {
                for (loop2 = 0; loop2 < n; loop2++)
                {
                        if (map[loop1][loop2] == '*')
                        {
                                result[loop1][loop2] = '*';

                                if (loop1 != 0)
                                {
                                        Set_Mark(&(result[loop1-1][loop2]));
                                        if (loop2 != 0)
                                                Set_Mark(&(result[loop1-1][loop2-1]));                                        
                                        if (loop2 != n-1)
                                                Set_Mark(&(result[loop1-1][loop2+1] ));
                                }
                                if (loop1 != m-1)
                                {
                                        result[loop1 +1][loop2] ++;
                                        if (loop2 != 0)
                                                Set_Mark(&(result[loop1 +1][loop2-1]));
                                        if (loop2 != n-1)
                                                Set_Mark(&(result[loop1 +1][loop2+1]));
                                }

                                if (loop2 != 0)
                                        Set_Mark(&(result[loop1][loop2-1]));                                   
                                if (loop2 != n-1)
                                        Set_Mark(&(result[loop1][loop2+1]));   
                        }
                }
        }

        return 0;
}


int Print_Result(char** result, int m, int n)
{
        int loop1, loop2;
        for (loop1 = 0; loop1 < m; loop1++)
        {
                for (loop2 = 0; loop2 < n; loop2++)
                {
                        printf ("%c", result[loop1][loop2]);
                }
                printf("\n");
        }
        printf("\n");

        return 0;
}


int Set_Mark(char* target)
{
        if (*target != '*')
                *target = *target+1;
        return 0;
}

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

// Written by rinehart

// rinehart@naver.com

//2007. 6. 1

/* Note : About 110,000 times tries, the program freezed. I don't know why. Maybe the windows OS can't support too much loop or function calls. */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_INPUT   1000000
#define MIN_INPUT   1

 

int Get_Numbers(int *input_a, int *input_b);
int Get_Cycle(int x);

 

int main()
{
    int v_input_a, v_input_b, v_input_temp;
    int v_Max_counter = 0, v_Temp_counter = 0;
   
    if (Get_Numbers(&v_input_a, &v_input_b))
        return 0;   // Error   
   
    v_input_temp = v_input_a;
   
    while (v_input_temp <= v_input_b)
    {
        v_Temp_counter = Get_Cycle(v_input_temp);
        printf (";%d", v_input_temp);   // Progress
       
        if (v_Max_counter < v_Temp_counter)
            v_Max_counter = v_Temp_counter;
       
        v_input_temp++;
    }
   
    printf ("\n\n%d %d %d\n", v_input_a, v_input_b, v_Max_counter);
   
    return 0;
}

int Get_Numbers(int *input_a, int *input_b)
{
    char buf[80];
    char *token;
    int v_err = 0;
   
    *input_a = 0;   *input_b = 0;   // Init
   
    printf ("Input 2 numbers (%d ~ %d)\n", MIN_INPUT, MAX_INPUT);
   
    gets(buf);
    token = strtok(buf, " \n");
    if (token)
        *input_a = atoi(token);
    else
        v_err = 1;
   
    token = strtok(NULL, " \n");
    if (token)
        *input_b = atoi(token);
    else
        v_err = 1;
   
    if (*input_a > *input_b)
        v_err = 1;
    else if (*input_a < MIN_INPUT || *input_a > MAX_INPUT)
        v_err = 1;
    else if (*input_b < MIN_INPUT || *input_b > MAX_INPUT)
        v_err = 1;
   
    if (v_err)  //later, seperate error cases
        printf ("ERROR : Wrong Number\n\n");
   
    return v_err;
}

int Get_Cycle(int x)
{
    int counter = 1;
   
    while(x != 1)
    {
        if (x%2)    //Odd number
            x = (x*3)+1;
        else        //Even number
            x = x/2;
       
        counter++;
    }
   
    return counter;
}

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절


BLOG main image
일상, 프로그래밍, IT 그리고 직장생활, Dive, 여행 by 지그프리드

카테고리

Class List (402)
Studies (30)
Exercise & Quizz (10)
Term Project (0)
ECIM list (Help!) (10)
Issues & News (0)
Gossip about IT & Job (22)
Tools (2)
Think about the Justice (23)
Book Review (170)
조엘 온 소프트웨어(번역) (28)
Diary (87)
Vacations (9)
Clash of clans 클래시 오브.. (11)

글 보관함

달력

«   2020/08   »
            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          
Total : 321,752
Today : 9 Yesterday : 10