22-04-04-3190-뱀
본문 바로가기
알고리즘 모음집/New 알고리즘

22-04-04-3190-뱀

by KyeongMin 2022. 4. 4.
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

댓글