로봇 청소기 알고리즘 | 엔트리로 로봇청소기 프로그램 만들기 / Sw교육 #1 상위 97개 답변

당신은 주제를 찾고 있습니까 “로봇 청소기 알고리즘 – 엔트리로 로봇청소기 프로그램 만들기 / SW교육 #1“? 다음 카테고리의 웹사이트 https://you.experience-porthcawl.com 에서 귀하의 모든 질문에 답변해 드립니다: https://you.experience-porthcawl.com/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 초등미래교육공작소 이(가) 작성한 기사에는 조회수 8,069회 및 좋아요 52개 개의 좋아요가 있습니다.

Table of Contents

로봇 청소기 알고리즘 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 엔트리로 로봇청소기 프로그램 만들기 / SW교육 #1 – 로봇 청소기 알고리즘 주제에 대한 세부정보를 참조하세요

안녕하세요 초등미래교육공작소입니다.
엔트리로 로봇청소기 프로그램을 쉽고 재미있게 만들어 보았습니다. ^^ 즐겁고 유익하게 시청해주시면 감사하겠습니다.
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
#초등미래교육공작소 #초미공
초등미래교육공작소는 다양한 교육 컨텐츠를 제공합니다.
구독 \u0026 좋아요 \u0026 알람설정 부탁드립니다. ^^
▶초미공 구독 ☞ https://bit.ly/2uBqGNt
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
배경음악 소개
Adventures by A Himitsu https://www.youtube.com/channel/UCgFw…
Creative Commons — Attribution 3.0 Unported— CC BY 3.0
http://creativecommons.org/licenses/b…
Music released by Argofox https://youtu.be/8BXNwnxaVQE
Music provided by Audio Library https://youtu.be/MkNeIUgNPQ8
Sweet Life by Twisterium https://soundcloud.com/twisterium/
Music promoted by 무료음원 라이브러리 https://goo.gl/EMEefC
폰트
이 페이지에는 (주)아트앤디자인인터내셔널과 (주)산돌커뮤니케이션이 제공한 스웨거체가 적용되어 있습니다.

로봇 청소기 알고리즘 주제에 대한 자세한 내용은 여기를 참조하세요.

14503번: 로봇 청소기

로봇 청소기는 다음과 같이 작동한다. 현재 위치를 청소한다. 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다. 왼쪽 …

+ 여기에 표시

Source: www.acmicpc.net

Date Published: 10/21/2022

View: 9556

KR101281512B1 – 로봇청소기 및 그 제어방법

이를 위해 본 발명은, 로봇청소기의 제어방법에 있어서, 상기 로봇청소기가 왼쪽 또는 오른쪽 벽면을 따라 주행하는 좌수법 또는 우수법 주행 알고리즘에 기반하여 …

+ 자세한 내용은 여기를 클릭하십시오

Source: patents.google.com

Date Published: 8/25/2022

View: 958

알고리즘 :: 백준 :: 시뮬레이션 :: 14503 :: 로봇 청소기 – velog

간단한 문제입니다. 조건을 정리해봅시다.이동하는 경우왼쪽으로 무조건 회전합니다.진행가능하다면 진행합니다.이동 불가능한 경우네 방향 모두 청소 …

+ 여기에 더 보기

Source: velog.io

Date Published: 6/7/2022

View: 8782

로봇 청소기 소프트웨어의 원리 – post.naver – 네이버

초기 로봇청소기 소프트웨어의 핵심 알고리즘은 직선으로 주행하다가 장애물을 만나면 방향을 트는 것이다. 그러나 지금은 로봇청소기에 딸린 여러 …

+ 더 읽기

Source: m.post.naver.com

Date Published: 5/3/2021

View: 8188

[백준 알고리즘]14503번: 로봇 청소기_Java

로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다.

+ 여기에 더 보기

Source: arinnh.tistory.com

Date Published: 10/12/2022

View: 3465

[baekjoon 14503] 로봇 청소기 (구현, 시뮬레이션) (C++)

로봇 청소기가 청소할 수 있는 영역의 개수를 구해야 한다. 일반 4방향 탐색이 아닌, 기본적으론 반시계 방향 탐색을 하며 여러 가지 규칙이 있다.

+ 여기에 자세히 보기

Source: bbeomgeun.tistory.com

Date Published: 6/14/2022

View: 4278

[SIM & BFS] 14503번 로봇 청소기 – SuperM

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. … #define MAX 51 #define INF 987654321 using namespace std; …

+ 여기에 표시

Source: hibee.tistory.com

Date Published: 8/28/2021

View: 3947

[논문]청소 로봇을 위한 특징점 맵 기반의 전 영역 청소 알고리즘

Feature Map Based Complete Coverage Algorithm for a Robotic Vacuum Cleaner. 한국지능시스템학회 논문지 = Journal of Korean institute of intelligent systems v.20 …

+ 자세한 내용은 여기를 클릭하십시오

Source: scienceon.kisti.re.kr

Date Published: 11/6/2022

View: 956

ROS기반의 실내 청소 및 주행기술 연구 – KoreaScience

로봇청소기를 사용한 고객들은 로봇청소기에 대한 만족도가 매우 높은 편이다. 이러한 이유 … A* 알고리즘 : 주어진 지도에서 경로를 생성하기 위해.

+ 여기에 더 보기

Source: www.koreascience.or.kr

Date Published: 2/28/2022

View: 3211

주제와 관련된 이미지 로봇 청소기 알고리즘

주제와 관련된 더 많은 사진을 참조하십시오 엔트리로 로봇청소기 프로그램 만들기 / SW교육 #1. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

엔트리로 로봇청소기 프로그램 만들기 / SW교육 #1
엔트리로 로봇청소기 프로그램 만들기 / SW교육 #1

주제에 대한 기사 평가 로봇 청소기 알고리즘

  • Author: 초등미래교육공작소
  • Views: 조회수 8,069회
  • Likes: 좋아요 52개
  • Date Published: 2019. 3. 2.
  • Video Url link: https://www.youtube.com/watch?v=Hvf2Es3rGh8

14503번: 로봇 청소기

문제

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.

로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다.

로봇 청소기는 다음과 같이 작동한다.

현재 위치를 청소한다. 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다. 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다. 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다. 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다. 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.

로봇 청소기는 이미 청소되어있는 칸을 또 청소하지 않으며, 벽을 통과할 수 없다.

KR101281512B1 – 로봇청소기 및 그 제어방법 – Google Patents

G — PHYSICS

G05 — CONTROLLING; REGULATING

G05D — SYSTEMS FOR CONTROLLING OR REGULATING NON-ELECTRIC VARIABLES

G05D1/00 — Control of position, course or altitude of land, water, air, or space vehicles, e.g. automatic pilot

G05D1/02 — Control of position or course in two dimensions

G05D1/021 — Control of position or course in two dimensions specially adapted to land vehicles

G05D1/0212 — Control of position or course in two dimensions specially adapted to land vehicles with means for defining a desired trajectory

알고리즘 :: 백준 :: 시뮬레이션 :: 14503 :: 로봇 청소기

문제

문제접근

문제 이해

간단한 문제입니다. 조건을 정리 해봅시다. 이동하는 경우 왼쪽으로 무조건 회전 합니다. 진행가능하다면 진행합니다. 이동 불가능한 경우 네 방향 모두 청소되거나 벽인 경우 후진합니다. 후진조차 불가능한 경우 작동을 멈춥니다.

위에 파란색으로 표시한 조건을 꼭 반영하셔야 합니다.

이 문제에서 가장 까다로운 점은 로봇의 방향과 진행 방향 사이의 관계 를 찾는 것입니다. 로봇의 방향 진행 방향 (왼쪽, 오른쪽, 오른쪽, 아래쪽 순) 위쪽 (↑) 왼쪽 (←), 위쪽 (↑), 오른쪽 (→), 아래쪽 (↓) 왼쪽 (←) 위쪽 (↑), 오른쪽 (→), 아래쪽 (↓), 왼쪽 (←) 아래쪽 (↓) 오른쪽 (→), 아래쪽 (↓), 왼쪽 (←), 위쪽 (↑) 오른쪽 (→) 아래쪽 (↓), 왼쪽 (←), 위쪽 (↑), 오른쪽 (→) 로봇의 방향에 따라 같은 진행 방향이라도 실제로는 다른 방향으로 움직이게 됩니다. 규칙성은 ‘왼쪽 (←), 위쪽 (↑), 오른쪽 (→), 아래쪽 (↓)’이 로봇의 방향에 따라 한 칸씩 왼쪽으로 회전한다는 점입니다. 모듈라 연산을 사용 하면 쉽게 구할 수 있습니다.

이 부분은 설명이 어려우니 코드로 보시면 이해가 쉽습니다.

코드

# include int N , M , r , c , d , ans = 1 , map [ 50 ] [ 50 ] ; int moving [ 4 ] [ 2 ] = { { 0 , – 1 } , { – 1 , 0 } , { 0 , 1 } , { 1 , 0 } } ; int main ( ) { scanf ( “%d %d” , & N , & M ) ; scanf ( “%d %d %d” , & r , & c , & d ) ; for ( int y = 0 ; y < N ; ++ y ) for ( int x = 0 ; x < M ; ++ x ) scanf ( "%d" , & map [ y ] [ x ] ) ; map [ r ] [ c ] = 2 ; int cnt = 0 ; while ( true ) { int y = r + moving [ d ] [ 0 ] , x = c + moving [ d ] [ 1 ] ; d = ( d + 3 ) % 4 ; cnt ++ ; if ( ! map [ y ] [ x ] ) { ans ++ ; map [ y ] [ x ] = 2 ; cnt = 0 , r = y , c = x ; } if ( cnt == 4 ) { int reverse = ( d + 3 ) % 4 ; int y = r + moving [ reverse ] [ 0 ] , x = c + moving [ reverse ] [ 1 ] ; if ( map [ y ] [ x ] == 1 ) break ; cnt = 0 , r = y , c = x ; } } printf ( "%d" , ans ) ; } 결과

[백준 알고리즘]14503번: 로봇 청소기_Java

[문제]

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.

로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다.

로봇 청소기는 다음과 같이 작동한다.

현재 위치를 청소한다. 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다. 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다. 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다. 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다. 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.

로봇 청소기는 이미 청소되어있는 칸을 또 청소하지 않으며, 벽을 통과할 수 없다.

[입력]

첫째 줄에 세로 크기 N과 가로 크기 M이 주어진다. (3 ≤ N, M ≤ 50)

둘째 줄에 로봇 청소기가 있는 칸의 좌표 (r, c)와 바라보는 방향 d가 주어진다. d가 0인 경우에는 북쪽을, 1인 경우에는 동쪽을, 2인 경우에는 남쪽을, 3인 경우에는 서쪽을 바라보고 있는 것이다.

셋째 줄부터 N개의 줄에 장소의 상태가 북쪽부터 남쪽 순서대로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 빈 칸은 0, 벽은 1로 주어진다. 지도의 첫 행, 마지막 행, 첫 열, 마지막 열에 있는 모든 칸은 벽이다.

로봇 청소기가 있는 칸의 상태는 항상 빈 칸이다.

[출력]

로봇 청소기가 청소하는 칸의 개수를 출력한다.

[예제]

>문제 풀이

문제가 길고, 조건이 많다. 문제를 읽으면서 로봇 청소기 동작 원리를 대충 파악해야 안헷갈리고 풀 수 있다.

<입력>

N, M (배열 사이즈)

r, c (( r , c ):좌표 값)

d (direction: 청소기 방향)

배열 값들이(mat[N][M]) 입력된다.

이 문제는 주어진 방향을 기준으로 주변을 탐색해보면서 깊이있게 뻗어나가는 탐색을 한다.

그래서 dfs가 적합할 것이라 생각하여 dfs로 풀었다.

dfs(int x, int y, int dir) 함수{

1) 현재 위치 청소

2) 현재 위치와 방향 기준

왼쪽 방향의 공간이 청소되어있지 않으면? 1)번 부터 왼쪽 방향의 공간이 청소되어 있으면? dir를 왼쪽 방향으로 바꾸고 2)번으로 네 방향 모두 청소되어있거나 벽이면? dir를 유지한채로 한 칸 후진 후 2)번으로 네 방향 모두 청소되어있거나 벽이고 && 후진도 못하는 상황?? 작동 종료

}

각각의 조건에 대한 상황과 원하는 동작 처리를 잘 생각해야한다.

게다가 방향에 대한 조건이 0: 북, 1:동, 2:남, 3:서 로 반시계 방향도 아니기 때문에, 방향을 바꿀 때 처리를 주의해줘야 한다.

>전체 코드

import java.util.*; public class Main { static int N, M, cnt=0; static int mat[][], visited[][]; public static void main(String [] args) { int r, c, d; //(r, c)좌표, d:방향 Scanner scan= new Scanner(System.in); N= scan.nextInt(); M= scan.nextInt(); r= scan.nextInt(); c= scan.nextInt(); d= scan.nextInt(); //0북, 1동, 2남, 3서 mat= new int[N][M]; visited= new int[N][M]; for(int i=0; i=N||ny<0||ny>=M) { }else if(mat[nx][ny]==0&&visited[nx][ny]==0) { dfs(nx, ny, dir); cnt++; break; } cant++; } x= x-dx[dir]; y= y-dy[dir]; if(x<0||x>=N||y<0||y>=M) { return; }else if(cant==4&&mat[x][y]==0) { dfs(x, y, dir); } }//dfs }

https://www.acmicpc.net/problem/14503

[baekjoon 14503] 로봇 청소기 (구현, 시뮬레이션) (C++)

728×90

https://www.acmicpc.net/problem/14503

로봇 청소기가 청소할 수 있는 영역의 개수를 구해야 한다.

일반 4방향 탐색이 아닌, 기본적으론 반시계 방향 탐색을 하며 여러 가지 규칙이 있다.

현재 위치를 청소한다. 현재 위치에서 현재 방향을 기준으로 왼쪽 방향부터 차례대로 인접한 칸을 탐색한다. 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다. 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다. 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다. 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.

사실 구현, 시뮬레이션 문제는 규칙 따라 하라는 대로 하면 풀린다. 하지만 보통 규칙이 복잡해서 정리가 안된다.

나의 경우 규칙 2-3을 제대로 읽지 않아서 디버깅에 시간을 좀 썼다.

“네 방향 모두 청소가 이미 되어있거나 벽인 경우에는” 이란 키워드에 집중해서 후진도 저 케이스에는 못하는 걸로 생각했다. 하지만 후진은 벽이 아니면 가능하다!

또한, 2-1이 부합하면 회전 후 한 칸 전진이고, 2-2면 그냥 회전만 한다.

나머지 조건은 귀찮은 조건들이어서 차근차근 풀었다.

1번 조건은 그 영역을 청소한다 이므로 그냥 flag를 이용해서 cnt++만 해주었다.

그리고 2번 조건은 왼쪽 방향부터 차례차례 4방향을 봐야 하므로 for문을 이용해주었고

2-1 조건에 부합하면 for문을 벗어나 주었다.

2-2 조건에 부합하면 for문을 벗어나지 않고 다음 방향으로 회전만 하고 계속 진행.

2-3 조건에 부합하면 방향 따라 후진하고 후진 가능하면 후진, 아니면 종료했다.

#include using namespace std; int n, m, room[51][51], r, c, d, check[51][51]; int moving[4][2] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1}}; int searching(int startX, int startY, int dir) { int cnt = 0; int x = startX, y = startY, d = dir; int searchFlag = true; while (1) { if (searchFlag) { // 청소 가능하면 그 영역을 청소하고 영역을 센다. if (!check[x][y]) { cnt++; check[x][y] = true; } } // 아니면 바로 조건 2번(반시계 4방향 탐색 시작) searchFlag = false; // 조건 2-b, 2-c를 위해서 매번 초기화 for (int i = 0; i < 4; i++) { int nd = (d + 3) % 4; int nx = x + moving[(d + 3) % 4][0]; int ny = y + moving[(d + 3) % 4][1]; if (nx >= 0 && nx < n && ny >= 0 && ny < m) { if (room[nx][ny] == 0 && !check[nx][ny]) { x = nx; y = ny; d = nd; searchFlag = true; break; } // 다시 1번으로(현재 위치 청소) else if (room[nx][ny] == 1 || check[nx][ny]) { check[nx][ny] = true; d = nd; // 방향만 갱신해준다. continue; // 다른 방향을 봐야하므로 for문을 벗어나지 않는다. } } } if (!searchFlag) { // 4방향 이미 청소되어 있다면 방향 그대로 후진 x = x + moving[(d + 2) % 4][0]; y = y + moving[(d + 2) % 4][1]; if (x < 0 || y < 0 || x >= n || y >= m) return cnt; if (room[x][y] == 0) // 벽이 아니면 계속 진행 continue; if (check[x][y]) // 벽 + 후진했는데 이미 청소한 곳이면 종료 return cnt; } } return cnt; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m; cin >> r >> c >> d; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> room[i][j]; } } cout << searching(r, c, d); } 728x90

SuperM :: [SIM & BFS] 14503번 로봇 청소기

14503_로봇 청소기

14503번 로봇 청소기

문제

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.

로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다.

로봇 청소기는 다음과 같이 작동한다.

현재 위치를 청소한다. 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다. 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다. 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다. 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다. 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.

로봇 청소기는 이미 청소되어있는 칸을 또 청소하지 않으며, 벽을 통과할 수 없다.

입력

첫째 줄에 세로 크기 N과 가로 크기 M이 주어진다. (3 ≤ N, M ≤ 50)

둘째 줄에 로봇 청소기가 있는 칸의 좌표 (r, c)와 바라보는 방향 d가 주어진다. d가 0인 경우에는 북쪽을, 1인 경우에는 동쪽을, 2인 경우에는 남쪽을, 3인 경우에는 서쪽을 바라보고 있는 것이다.

셋째 줄부터 N개의 줄에 장소의 상태가 북쪽부터 남쪽 순서대로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 빈 칸은 0, 벽은 1로 주어진다. 장소의 모든 외곽은 벽이다.

로봇 청소기가 있는 칸의 상태는 항상 빈 칸이다.

출력

로봇 청소기가 청소하는 칸의 개수를 출력한다.

예제 입력

3 3 1 1 0 1 1 1 1 0 1 1 1 1

11 10 7 4 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1

예제 출력

1

57

해결방법

종료 조건까지 조건대로 움직여 결과를 내야하는 시뮬레이션 문제이다

제시된 조건은 아래와 같다

현재 위치를 청소함 현재 방향에서 -90도 회전하며 탐색 회전 방향이 청소가 안됐으면 그 방향으로 회전 후 전진

네 방향 모두 청소가 되어있거나 벽인 경우 원래 방향에서 후진

후진이 불가능 하다면 END

큐(Queue) 를 활용해서 문제를 접근했다

먼저 시작점을 큐에 넣고 탐색을 시작한다 큐를 돌며 아직 청소가 안되어있다면 청소를 한다 청소를 마쳤으면 현재 방향에서 왼쪽 방향 노드부터 청소 여부 & 벽이 존재함을 확인한다 만약 아직 청소가 안되어있고 벽이 아니라면? 그 방향으로 회전시키고 한 칸 전진하는 정보를 큐에 담는다

flag = true 를 통해 다른 노드로 전진했다는 정보를 담는다

를 통해 다른 노드로 전진했다는 정보를 담는다 다른 노드로 전진했다면 break 를 통해 4방향 반복문을 탈출한다 flag = false 라면? 4방향 탐색을 통해 아무 노드에도 나아가지 못했기 때문에 후진을 해야한다

뒤에 노드가 벽이 아니라면 현재 방향을 유지한 채 후진을 하고 continue 를 수행한다 만약 후진을 시도할 때, 뒤의 노드가 벽이라면 탐색을 종료한다

소스코드

#include #include #include #include #include #include #include #include #define MAX 51 #define INF 987654321 using namespace std; /* TC 11 10 7 4 0 0 0 0 0 0 0 0 0 0 0 0 56 57 46 45 44 43 42 41 0 0 55 48 47 0 0 0 0 40 0 0 50 49 0 0 36 37 38 39 0 0 51 0 0 35 34 31 30 0 0 0 52 53 12 11 33 32 29 28 0 0 54 14 13 10 9 0 0 27 0 0 16 15 2 1 8 0 0 26 0 0 17 18 3 4 7 0 0 25 0 0 21 19 20 5 6 22 23 24 0 0 0 0 0 0 0 0 0 0 0 */ struct robot { int x,y,dir; robot() { } robot(int _x,int _y,int _dir) : x(_x),y(_y),dir(_dir) { } }; int n,m,ans; int map[MAX][MAX]; bool visited[MAX][MAX]; robot s; // 북 동 남 서 int dx[4] = {-1,0,1,0}; int dy[4] = {0,1,0,-1}; int changeDir(int dir){ if(dir == 0) return 3; else if(dir == 3) return 2; else if(dir == 2) return 1; else return 0; } void solve(){ queue q; q.push(s); while(!q.empty()){ int x = q.front().x; int y = q.front().y; int dir = q.front().dir; q.pop(); // 1. 현재 위치 청소 if(!visited[x][y]){ visited[x][y] = true; ans++; } // 2. 현재 방향에서 -90도 회전하며 탐색 bool flag = false; int nd = dir; for(int i=0; i<4; i++){ nd = changeDir(nd); int nx = x + dx[nd]; int ny = y + dy[nd]; if(nx<0 || ny<0 || nx>=n || ny>=m) continue; if(visited[nx][ny]) continue; if(map[nx][ny] == 1) continue; // 2.1. 회전 방향이 청소가 안됐으면 회전 후 전진 q.push(robot(nx,ny,nd)); flag = true; break; } // 네 방향 모두 돌지 못했을 경우 if(!flag){ // 원래 방향에서 후진 int bd = (dir + 2) % 4; int nx = x + dx[bd]; int ny = y + dy[bd]; if(nx<0 || ny<0 || nx>=n || ny>=m) continue; // 2.2. 네 방향 모두 청소되어 있거나 벽인 경우 원래 방향에서 후진 if(map[nx][ny] != 1){ q.push(robot(nx,ny,dir)); continue; } // 2.3. 후진을 못한다면 종료 else{ return; } } } } int main(int argc, const char * argv[]) { // cin,cout 속도향상 ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> m; cin >> s.x >> s.y >> s.dir; for(int i=0; i> map[i][j]; } } memset(visited, false, sizeof(visited)); ans = 0; solve(); cout << ans << " "; return 0; } 티스토리툴바

[논문]청소 로봇을 위한 특징점 맵 기반의 전 영역 청소 알고리즘

초록

청소 로봇의 중요한 기술 중 하나는 커버리지 성능이다. 대부분의 가정용 청소 로봇들은 로봇의 크기나 제작 비용 때문에 로봇을 구성하는 시스템 구성에 제약을 받게 된다. 이러한 이유 때문에 청소 로봇의 가장 중요한 요소인 커버리지 성능을 높이는데 필요한, 위치 인식이나 맵 구성을 위한 기존의 알고리즘들을 쉽게 적용할 수가 없다. 본 논문에서는 청소 로봇을 위한 두 가지 문제에 초점을 맞추어 이를 해결 할 수 있는 방안을 제시한다. 먼저 계산 량을 줄여 저가형 시스템을 구성할 수 있어야 한다. 이를 위해 청소 환경을 단순화 하는 형태로 변화 시켜 위치 인식과 특징점 맵을 구성하는데 필요한 계산량을 줄이는 방법을 제안한다. 두 번째로 청소로봇에 사용하는 센서들의 성능이 매우 제한적이다. 청소 로봇에 가장 많이 사용되는 센서는 초음파 센서와 적외선 센서이다. 초음파 센서의 경우에는 로봇의 크기나 구조적인 문제 때문에 측정 범위가 제한되고, 적외선의 경우엔 비용 문제와 센서 자체가 가지고 있는 측정 범위에 대한 문제에 의해 근거리 측정용 센서만을 사용한다. 이러한 센서들의 성능을 고려한 특징점 추출 방법을 설명하고 이를 이용한 맵 구성과 청소 영역 분할에 대한 방법을 제안한다. 본 논문에서 제안된 전 영역 청소를 위한 알고리즘들은 실제 판매되는 청소 로봇에 적용하여, 그 성능을 검증한다.

키워드에 대한 정보 로봇 청소기 알고리즘

다음은 Bing에서 로봇 청소기 알고리즘 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 엔트리로 로봇청소기 프로그램 만들기 / SW교육 #1

  • 소프트웨어교육
  • SW교육
  • 초등미래교육공작소
  • 초미공
  • 엔트리
  • Entry
  • 프로그래밍
  • programming
  • 코딩
  • cording
  • 알고리즘

엔트리로 #로봇청소기 #프로그램 #만들기 #/ #SW교육 ##1


YouTube에서 로봇 청소기 알고리즘 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 엔트리로 로봇청소기 프로그램 만들기 / SW교육 #1 | 로봇 청소기 알고리즘, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment