Notice
Recent Posts
Recent Comments
«   2025/02   »
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
Tags more
Archives
Today
Total
관리 메뉴

Share Garam's everyday life.

로봇청소기 코드 본문

가람이 이야기

로봇청소기 코드

가람스나이퍼님 (Joshua_Choi_Brother) 2018. 3. 2. 07:20

#define   _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<stdlib.h>


int left(int r, int c, int d, int **arr);

void leftrotate(int *d);

void forward(int *r, int *c, int d);

void backward(int *r, int *c, int d);

int notblock(int r, int c, int d, int **arr);


int main(void) {

int N = 0;

int M = 0;

int r, c, d;

int **arr;

int i, j;


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

scanf("%d %d %d", &r, &c, &d);


arr = (int **)malloc(N * sizeof(int *));

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

arr[i] = (int *)malloc(M * sizeof(int));


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

for (j = 0; j < M; j++) {

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

}

}


int count = 0;

int turn = 0;

int flag = 0;


while (1) {

arr[r][c] = 2; //청소했다.

count++;

while (1) {

if (4 > turn) {

if (left(r, c, d, arr) == 0) {

leftrotate(&d);

forward(&r, &c, d);

turn = 0;

break;

}

else {

leftrotate(&d);

turn++;

continue;

}

}

else if (8 > turn) {

if (notblock(r, c, d, arr) == 1) {

backward(&r, &c, d);

turn = 0;

continue;

}

else {

flag = 1;

break;

}

}

}

if (flag == 1) {

flag = 0;

break;

}

}

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

return 0;

}


int left(int r, int c, int d, int **arr) {

if (d == 0) //북 

return arr[r][c - 1];

else if (d == 1) //동

return arr[r - 1][c];

else if (d == 2) //남

return arr[r][c + 1];

else if (d == 3) //서

return arr[r + 1][c];

else

return 0;

}


void leftrotate(int *d) {

if (*d == 0) //북쪽을 보면 

*d = 3;  //서쪽으로 방향을 옮긴다.

else if (*d == 1) //동쪽을 보면

*d = 0;       //북쪽으로 방향을 옮긴다. 

else if (*d == 2) //남쪽을 보면

*d = 1;       //동쪽으로 방향을 옮긴다. 

else if (*d == 3) //서쪽을 보면 

*d = 2;       //남쪽으로 방향을 옮긴다.

else

;

}


void forward(int *r, int *c, int d) {

if (d == 0) //북 

*r -= 1;

else if (d == 1) //동

*c += 1;

else if (d == 2)  //남

*r += 1;

else if (d == 3)  //서

*c -= 1;

else

;

}


int notblock(int r, int c, int d, int **arr) {

if (d == 0) { //북  

if (arr[r + 1][c] == 2) // 뒤를 확인한다. 청소가 됬는지 

return 1; // 맞으면 1을 반 

else

return 0;  // 틀리면 0을 반환 

}

else if (d == 1) { // 동 

if (arr[r][c - 1] == 2)

return 1;

else

return 0;

}

else if (d == 2) { // 남

if (arr[r - 1][c] == 2)

return 1;

else

return 0;

}

else if (d == 3) { // 서

if (arr[r][c + 1] == 2)

return 1;

else

return 0;

}

}


void backward(int *r, int *c, int d) {

if (d == 0) //북 

*r += 1;

else if (d == 1) // 동

*c -= 1;

else if (d == 2) // 남

*r -= 1;

else if (d == 3)  //서

*c += 1;

else

;

}