728x90
반응형
01.필요알고리즘
01.1 뱀의 머리와 꼬리 구분
tail = ret - size;
01.2 뱀이 방향을 이동하는 시기
if (ret == X) {
if (C == 'D') {
dir++;
if (dir == 4)dir = 0;
}
else {
dir--;
if (dir == -1)dir = 3;
}
if (l != L - 1)break;
}
01.3 뱀이 종료되는 시점
if (!(1 <= y && y <= N && 1 <= x && x <= N) || (board[y][x] != 0 && tail <= board[y][x])) {//탈출
while (l != L-1) {
l++;
scanf("%d %c", &X, &C);
}
break;
}
01.4 뱀이 사과먹거나 이동하는 부분
++ret;
y += dy[dir];
x += dx[dir];
if (board[y][x] == -1) {// 사과 위치
board[y][x] = 0;
size++;
}
tail = ret - size ;
02.알고리즘을 구현할때 중간중간에 주의
- if (l != L - 1)break;
- 이런경우를 제외 하지 않으면 그냥 게임 종료됨
-
while (l != L-1) { l++; scanf("%d %c", &X, &C); }
- 이것을 해야 입력이 남지 않음 게임이 그전에 끝날 수 있음
03.전체소스
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
#define NSIZE 102
int N;
int K;
int L;
int ret;
int board[NSIZE][NSIZE];
int dy[] = { 0,1,0,-1 };
int dx[] = { 1,0,-1,0 };
void initValue()
{
memset(board, 0, sizeof(board));
ret = 1;
N = K = 0;
scanf("%d", &N);// 보드판 수
scanf("%d", &K);// 사과 개수
for (int k = 0; k < K; k++) {
int y, x;
scanf("%d %d", &y, &x);
board[y][x] = -1;
}
}
void play() {
int y = 1; int x = 1;
int size = 1;
int head = 1;
int tail = 0;
int dir = 0;
board[1][1] = 1;
ret = 0;
scanf("%d", &L);
for (int l = 0; l < L; l++) {
int X; char C;
scanf("%d %c", &X, &C);
while (1) {
if (ret == X) {
if (C == 'D') {
dir++;
if (dir == 4)dir = 0;
}
else {
dir--;
if (dir == -1)dir = 3;
}
if (l != L - 1)break;
}
++ret;
y += dy[dir];
x += dx[dir];
if (board[y][x] == -1) {// 사과 위치
board[y][x] = 0;
size++;
}
tail = ret - size ;
if (!(1 <= y && y <= N && 1 <= x && x <= N) || (board[y][x] != 0 && tail <= board[y][x])) {//탈출
while (l != L-1) {
l++;
scanf("%d %c", &X, &C);
}
break;
}
board[y][x] = ret;
}
}
}
int main(void)
{
initValue();
play();
cout << ret;
return 0;
}
728x90
반응형
'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글
22-04-09-14502-연구소 (0) | 2022.04.10 |
---|---|
22-04-05-14499주사위굴리기 (0) | 2022.04.05 |
22.04.02_12100_2048Easy (0) | 2022.04.03 |
22.02.08_퀵소트 (0) | 2022.02.09 |
2021.12.07_2819격자판의숫자이어붙이기 (0) | 2021.12.07 |
댓글