Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 백준 17822
- c#
- 해시 구현
- dfs
- qorwns
- 백준 17779
- 백준 17471
- 1764
- C/C++ 구현
- heap
- 백준 5397
- 백준
- 스택의 특징
- 백준 1158
- 풀이
- 게리멘더링2
- Stack 이란
- 백준 1406
- 5397
- ㅣ풀이
- 백준 2447
- 해시구현
- 구현
- 원판 돌리기
- 자료구조
- 버킷 정렬
- AVL 시간 복잡도
- 별 찍기 10
- 조세퍼스 순열
- 시간 복잡도
Archives
- Today
- Total
홍시홍의 프로그래밍
[백준 17837] 새로운 게임2 본문
https://www.acmicpc.net/problem/17837
17837번: 새로운 게임 2
재현이는 주변을 살펴보던 중 체스판과 말을 이용해서 새로운 게임을 만들기로 했다. 새로운 게임은 크기가 N×N인 체스판에서 진행되고, 사용하는 말의 개수는 K개이다. 말은 원판모양이고, 하나의 말 위에 다른 말을 올릴 수 있다. 체스판의 각 칸은 흰색, 빨간색, 파란색 중 하나로 색칠되어있다. 게임은 체스판 위에 말 K개를 놓고 시작한다. 말은 1번부터 K번까지 번호가 매겨져 있고, 이동 방향도 미리 정해져 있다. 이동 방향은 위, 아래, 왼쪽, 오른쪽
www.acmicpc.net
요구사항
1. 말과 map의 구현
말 구조체 사용, map은 vector 사용
2. 순서대로 이동하기
1~말의 갯 수 까지 순서대로 이동한다.
3. 조건 구현하기
3.1 map에서 이동하는 now 숫자의 위치가 어디 있는지 찾는다.
3.2 now 숫자의 정보를 업데이트 한다.
3.3 3.1에서 찾은 위치를 바탕으로 문제의 정보대로 순서를 처리해준다.
4이상이라고 했는데 4일 경우 종료하여서 한참을 찾아해맨문제이다.
문제 제대로 읽기, 조건 제대로 처리해주기
#include <iostream>
#include <vector>
using namespace std;
struct go {
int x;
int y;
int dir;
};
int map[21][21];
vector<int> visit[21][21];
go num[11];
int n, k;
int ans = 0;
int dr[5] = { 0,0,0,-1,1 };
int dc[5] = { 0,1,-1,0,0 };
int getdir(int d)
{
if (d == 1)
return d = 2;
else if (d == 2)
return d = 1;
else if (d == 3)
return d = 4;
else if (d == 4)
return d = 3;
}
void solve()
{
int cnt = 0;
while (true)
{
if (cnt > 1000)
{
ans = -1;
return;
}
//cout << "A" << endl;
for (int i = 1; i <= k; i++)
{
// cout << "K" << i << endl;
int x = num[i].x;
int y = num[i].y;
int dir = num[i].dir;
int idx = 0;
// cout << x << " " << y << endl;
//지도에서 몇번 째에 있는가
for (int j = 0; j < visit[x][y].size(); j++)
{
int value = visit[x][y][j];
if (value == i){
idx = j+1;
break;
}
}
//현재 위치의 정보 업데이트
int nx = x + dr[dir];
int ny = y + dc[dir];
if (nx < 0 || ny < 0 || nx >= n || ny >= n || map[nx][ny] == 2)
{
dir = getdir(dir);
int nnx = x + dr[dir];
int nny = y + dc[dir];
if (nnx < 0 || nny < 0 || nny >= n || nnx >= n)
{
num[i].x = x;
num[i].y = y;
num[i].dir = dir;
continue;
}
if (map[nnx][nny] == 2)
{
// cout << "QWER" << endl;
num[i].x = x;
num[i].y = y;
num[i].dir = dir;
continue;
}
else
{
num[i].x = nnx;
num[i].y = nny;
num[i].dir = dir;
}
}
else
{
if (map[nx][ny] == 0)
{
num[i].x = nx;
num[i].y = ny;
num[i].dir = dir;
}
else if (map[nx][ny] == 1)
{
num[i].x = nx;
num[i].y = ny;
num[i].dir = dir;
}
}
// cout << num[i].x << " " << num[i].y << endl;
// cout << x << " " << y << endl;
// 색깔에 따라서 위치 이동 시켜주기
if (map[num[i].x][num[i].y] == 1)
{
//위에서 부터 이동
for (int j = visit[x][y].size(); j >= idx; j--)
{
int nnum = visit[x][y][j-1];
num[nnum].x = num[i].x;
num[nnum].y = num[i].y;
visit[num[i].x][num[i].y].push_back(nnum);
}
int s = visit[x][y].size();
for (int j = s; j >= idx; j--)
{
visit[x][y].pop_back();
}
}
else if (map[num[i].x][num[i].y] == 0)
{
//idx자리 부터 이동
for (int j = idx; j <= visit[x][y].size(); j++)
{
int nnum = visit[x][y].at(j - 1);
num[nnum].x = num[i].x;
num[nnum].y = num[i].y;
visit[num[i].x][num[i].y].push_back(nnum);
}
int s = visit[x][y].size();
for (int j = idx; j <= s; j++)
{
visit[x][y].pop_back();
}
}
//검사
if (visit[num[i].x][num[i].y].size() >= 4)
{
ans = cnt;
return;
}
// cout << "B" << endl;
}
cnt++;
}
}
int main()
{
cin >> n >> k;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
scanf("%d", &map[i][j]);
}
for (int i = 1; i <= k; i++){
int x, y, z;
scanf("%d%d%d", &num[i].x, &num[i].y, &num[i].dir);
num[i].x -= 1;
num[i].y -= 1;
visit[num[i].x][num[i].y].push_back(i);
}
solve();
if (ans == -1)
cout << -1 << endl;
else
cout << ans+1 << endl;
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 1158] 조세퍼스 문제 (0) | 2019.11.18 |
---|---|
[백준 1158] 조세퍼스 문제 (0) | 2019.11.16 |
[백준 17822] 원판 돌리기 (0) | 2019.11.14 |
[백준 17779] 게리맨더링2 (0) | 2019.11.12 |
[백준 17471] 게리멘더링 (0) | 2019.09.20 |
Comments