์ผ์ฑ SW ์ญ๋ํ ์คํธ 2021 ํ๋ฐ๊ธฐ ๊ธฐ์ถ
์ ์ก๋ฉด์ฒด ํ๋ฒ ๋ ๊ตด๋ฆฌ๊ธฐ
1์ด์ 6์ดํ ์ค ์์์ ์ซ์๊ฐ ๊ทธ๋ ค์ง n * n ๊ฒฉ์ํ์ ํ ๋ฉด์ด 1 * 1 ํฌ๊ธฐ์ธ ์ ์ก๋ฉด์ฒด๋ฅผ ๋์ฌ์ ธ ์์ต๋๋ค. ํด๋น ๊ฒฉ์ํ์์ ์ ์ก๋ฉด์ฒด๋ฅผ ๊ตด๋ฆฌ๋ คํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด 4 * 4 ํฌ๊ธฐ์ ๊ฒฉ์ํ์ด ์ฃผ์ด์ก๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
์ฒ์ ์ ์ก๋ฉด์ฒด์ ๊ฐ ๋ฉด์๋ 1๋ถํฐ 6๊น์ง์ ์ซ์๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฐ์ฌ์ ธ ์๊ณ m๋ฒ์ ๊ฑธ์ณ ์ฃผ์ฌ์๋ฅผ ๊ณ์ 1์นธ์ฉ ๊ตด๋ฆฌ๊ฒ ๋ฉ๋๋ค. ์ด๋, ๋ง์ฃผ๋ณด๋ ๋ฉด์ ์ ํ์๋ ์ซ์์ ํฉ์ ์ ํํ 7์ ๋๋ค.
์ฃผ์ฌ์๋ ํญ์ ์ด๊ธฐ์ ๊ฒฉ์ํ์ 1ํ 1์ด์ ๋์ฌ์ ธ ์๊ณ , ์ฒ์์๋ ํญ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์์ง์ ๋๋ค.
(์ค๋ต)
n * n ํฌ๊ธฐ์ ๊ฒฉ์ํ์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, m๋ฒ ์งํํ๋ฉฐ ์ป๊ฒ๋๋ ์ ์์ ์ด ํฉ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ณด์ธ์.
์ ๋ ฅ ํ์
์ฒซ์งธ์ค์ ๊ฒฉ์ ํฌ๊ธฐ n, ๊ทธ๋ฆฌ๊ณ ๊ตด๋ฆฌ๋ ํ์ m์ด ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋๋ค.
๋์งธ์ค๋ถํฐ n+1๋ฒ์งธ ์ค๊น์ง ๊ฒฉ์ํ์ ์ ํ์๋ ์ n๊ฐ๊ฐ ํ ์ค์ ํ๋์ฉ ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋๋ค.
- 2 ≤ n ≤ 20
- 1 ≤ m ≤ 1000
- 1 ≤ ๋งํ์ ์ฐ์ฌ์ง ์ ≤ 6
์ถ๋ ฅ ํ์
์ฃผ์ฌ์๋ฅผ m๋ฒ ๊ตด๋ ธ์ ๋ ๊น์ง ์ป๊ฒ๋๋ ์ด ์ ์์ ํฉ์ ์ถ๋ ฅํฉ๋๋ค.
์ผ๋จ ์๊ณ ๋ฆฌ์ฆ ์์ฒด๋ ๊ต์ฅํ..๋จ์ํ ๋ฌธ์ ์ด๋ค.
bfs ํน์ dfs๋ก ํ์ํ๊ณ ์ฃผ์ฌ์๋ง ์ ๊ตด๋ ค์ฃผ๋ฉด ๋๋ ๋ฌธ์ .
๊ทธ๋ฐ๋ฐ ์ฃผ์ฌ์ ๋๋ฆด๋ ์ซ์๋ฅผ ์ด๋ป๊ฒ ์ ์ฅํ๊ณ ๊ฐฑ์ ํด์ผํ ์ง ๊ฐ์ด ์์กํ์ ํด์ค์ ์ฐธ๊ณ ํ๋ค.
์ค๊ฐ์ ์ค์ ํ๋ ๋๋ฌธ์ ๋ช์ญ๋ถ ๋ ๋ ค๋จน์๋๋ฐ,,
์ ์ ์ฐจ๋ฆฌ์!!!!
๋์ ํ์ด
#include <iostream>
#include <queue>
using namespace std;
int n;
int m;
int map[21][21];
pair<int,int> dice;
int moveDirection = 0; // 0=์ค๋ฅธ์ชฝ,1=์๋,2=์ผ์ชฝ,3=์
int Bottom = 6; // ์ฃผ์ฌ์ ๋ฐ๋ฅ์ซ์ ์ด๊ธฐ๊ฐ
int Up = 1;
int Right = 3;
int Front = 2;
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
int Point = 0;
void checkDirection(int num){
// cout << "Bottom = "<<Bottom<<"\n";
if(Bottom > num) {
if(moveDirection<3) moveDirection++;
else moveDirection = 0;
} else if(Bottom < num){
if(moveDirection>0) moveDirection--;
else moveDirection = 3;
} else return;
}
void checkBFS(int x, int y){
// ํ์ฌ ์ขํ ๋ฐ์์ผํจ
int visited[21][21]={0};
queue<pair<int,int>> q;
q.push({x,y});
visited[x][y] = 1;
int tmp = map[x][y];
int cnt = 1;
while(!q.empty()){
pair<int,int> a = q.front();
q.pop();
for(int i=0; i<4; ++i){
int nx = a.first + dx[i];
int ny = a.second + dy[i];
if(nx<0 || ny<0 || nx>n || ny>n) continue;
if(map[nx][ny] != tmp) continue;
if(visited[nx][ny]) continue;
q.push({nx,ny});
visited[nx][ny] = 1;
cnt++;
}
}
Point += tmp * cnt;
// cout << tmp << " * " << cnt << " => "<< Point<<"\n";
checkDirection(tmp);
}
void moveDice(){
// cout << "\n"<<dice.first <<" "<< dice.second << "\n";
int tmp = Up;
if(moveDirection==0){ // ์ค๋ฅธ์ชฝ
if(dice.second + 1 > n){
moveDirection = 2;
moveDice();
return;
}
else {
// cout << "right\n";
Up = 7 - Right;
Right = tmp;
Bottom = 7 - Up;
dice.second++;
}
}
else if(moveDirection==1){ // ์๋
if(dice.first + 1 > n){
moveDirection = 3;
moveDice();
return;
}else {
// cout << "down\n";
Up = 7-Front;
Front = tmp;
Bottom = 7-Up;
dice.first ++;
}
}
else if(moveDirection==2){ // ์ผ์ชฝ
if(dice.second - 1 < 1){
moveDirection = 0;
moveDice();
return;
}else {
// cout << "left\n";
Up = Right;
Right = 7-tmp;
Bottom = 7-Up;
dice.second --;
}
}
else if(moveDirection==3){ // ์
if(dice.first - 1 < 1){
moveDirection = 1;
moveDice();
return;
}else {
// cout << "up\n";
Up = Front;
Front = 7-tmp;
Bottom = 7-Up;
dice.first --;
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
cin >> map[i][j];
}
}
dice = {1,1};
for(int i=0; i<m; ++i){
moveDice();
checkBFS(dice.first, dice.second);
}
cout << Point;
return 0;
}
'๐ ์๊ณ ๋ฆฌ์ฆ > Code Tree' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ฝ๋ํธ๋ฆฌ] ์ฝ๋ํธ๋ฆฌ๋นต - ์๋ฎฌ๋ ์ด์ (๊ธฐ์ถ๋ฌธ์ ) (0) | 2023.04.08 |
---|---|
[์ฝ๋ํธ๋ฆฌ] ์ธ์๋ - ์๋ฎฌ๋ ์ด์ (๊ธฐ์ถ๋ฌธ์ ) (0) | 2023.04.07 |
[์ฝ๋ํธ๋ฆฌ] ๋๋ฌด๋ฐ๋ฉธ - ์๋ฎฌ๋ ์ด์ (๊ธฐ์ถ๋ฌธ์ ) (0) | 2023.04.07 |
[์ฝ๋ํธ๋ฆฌ] ์์ ์ฑ - ์๋ฎฌ๋ ์ด์ , BFS/DFS (๊ธฐ์ถ๋ฌธ์ ) (2) | 2023.04.06 |
[์ฝ๋ํธ๋ฆฌ] BFS ํ์ / ๊ฐ ์ ์๋ ๊ณณ๋ค (0) | 2023.02.22 |