Mini
[틀림] 백준 17822 원판돌리기 // 구현, 배열회전, 원형 dfs 본문
https://www.acmicpc.net/problem/17822
* 틀린풀이
- 인접한것들 지우는 idea (좌우, 상하 1개씩만 비교)
- 반례 : 3단 인접인경우, 처리가 안됨
- dfs를 해야하나?
* 정답풀이
- 원형 dfs에서 next 계산방법
- else if 주의
- 수정후 else if 안하면 바로 조회하기때문에 오답이됨. else if 써야함.
#include<bits/stdc++.h>
using namespace std;
int n,m,t,ret, vis[54][54];
int x,d,k, found;
vector<int> v[54];
const int dy[] = {-1, 0, 1, 0}; // 상, 우, 하, 좌 (y 방향)
const int dx[] = {0, 1, 0, -1};
void calc() {
for(int i=0;i<n;++i) {
for(int j=0;j<m;++j) {
ret+=v[i][j];
}
}
}
void print() {
for(int i=0;i<n;++i) {
for(int j=0;j<m;++j) {
cout<<v[i][j]<<" ";
}cout<<"\n";
}
}
// idx먼째 벡터를 회전시키는 함수
void go(int idx) {
if (d == 1) { // 반시계 <-
rotate(v[idx].begin(), v[idx].begin() + k, v[idx].end());
} else { //시계 ->
rotate(v[idx].begin(), v[idx].begin() + v[idx].size() - k, v[idx].end());
}
// print();
}
void calcAvg() {
//평균계산
int sum=0; int cnt=0;
for(int i=0;i<n;++i) {
for(int j=0;j<m;++j) {
if(v[i][j]==0) continue;
sum+=v[i][j];
cnt++;
}
}
double avg = (double)sum / (double)cnt;
// 더하기
for(int i=0;i<n;++i) {
for(int j=0;j<m;++j) {
if(v[i][j]==0) continue;
if((double)v[i][j]>avg) {
v[i][j]--;
}
else if((double)v[i][j] < avg) { // ?? else if 안하면 오답?! 아, v[i][j]를 수정후 바로 조회해버리는 문제!
v[i][j]++;
}
}
}
}
void dfs(int y, int x) {
for(int i=0;i<4;++i) {
int ny=y+dy[i];
int nx=(x+dx[i]+m)%m; // ???
if(ny<0 || ny>=n) continue;
if(vis[ny][nx]) continue;
if(v[y][x]==v[ny][nx]) {
vis[y][x]=vis[ny][nx]=1;
found=1;
dfs(ny,nx);
}
}
}
void findAdj() {
found=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;++i) {
for(int j=0;j<m;++j) {
if(v[i][j]==0) continue;
if(vis[i][j]) continue;
dfs(i,j);
}
}
for(int i=0;i<n;++i) {
for(int j=0;j<m;++j) {
if(vis[i][j]) {
v[i][j]=0;
}
}
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n>>m>>t;
for(int i=0;i<n;++i) {
for(int j=0;j<m;++j) {
int tmp;
cin>>tmp;
v[i].push_back(tmp);
}
}
for(int i=0;i<t;++i) {
cin>>x>>d>>k;
for(int j=0;j<n;++j) {
if((j+1)%x==0) {
// cout<<"rotate "<<j<<"\n";
go(j);
}
}
findAdj();
// searchUpDown();
// searchLeftRight();
if(!found) {
calcAvg();
}
}
calc();
// print();
cout<<ret;
}
'Algorithm > dfs' 카테고리의 다른 글
[틀림] 백준 20165 도미노장인 // dfs, 구현 (0) | 2025.05.11 |
---|---|
[알고리즘] 리트코드 417. Pacific Atlantic Water Flow c++ // dp (0) | 2024.07.04 |
리트코드 1325 리프노드지우기 c++ (0) | 2024.05.17 |
[세모] [알고리즘] 백준 14888 연산자끼워넣기 c++ // dfs, 순열 (0) | 2024.03.20 |
[맞음] 백준 14889 스타트와링크 c++ // dfs, 사람기준으로 생각하라. 일단 모든경우의수를 벌려놓고 생각하라, 비트마스킹 (0) | 2024.03.20 |