인프런 커뮤니티 질문&답변
2 - D map 초기화
작성
·
130
0
답안 코드에서 x,y 좌표를 입력받고 그대로 map[y][x]=1의 작업을 수행하면
예시에서 나온 그림처럼 그려지지 않고 대충 x 축 대칭된 모양과 비슷하게 그려지는데
이 문제 뿐 아니라 다른 문제에서도 문제가 되지 않나요?
답변 1
1
큰돌
지식공유자
안녕하세요 지환님. ㅎㅎ
왜 대칭적으로 그려질까요?
자 예시에서 보여주는 그림은. 위쪽으로 0, 1, 2, 3 y좌표가 증가하죠?
근데 우리가 그리는 것은 아래쪽으로 0, 1, 2, 3 y좌표가 증가하죠? 그렇기 때문에 y축 대칭적으로 보이는 것일뿐.
올바르게 입력받고 올바르게 출력한것입니다.
만약 대칭적으로 출력하지 않고 싶다면 이렇게 하시면 됩니다.
m - 1부터 하시면 됩니다.
#include <cstdio>
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <stack>
using namespace std;
int _map[104][104], m, n, k, x1, x2, y1, y2;
const int dy[4] = {-1, 0, 1, 0};
const int dx[4] = {0, 1, 0, -1};
vector<int> ret;
int dfs(int y, int x){
_map[y][x] = 1;
int _ret = 1;
for(int i = 0; i < 4; i++){
int ny = y + dy[i];
int nx = x + dx[i];
if(ny < 0 || ny >= m || nx < 0 || nx >= n || _map[ny][nx] == 1) continue;
_ret += dfs(ny, nx);
}
return _ret;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> m >> n >> k;
for(int i = 0; i < k; i++){
cin >> x1 >> y1 >> x2 >> y2;
for(int y = y1; y < y2; y++){
for(int x = x1; x < x2; x++){
_map[y][x] = 1;
}
}
}
for(int i = m - 1; i >= 0; i--){
for(int j = 0; j < n; j++){
if(_map[i][j] == 1) cout << 1 << " ";
else cout << "0" << ' ';
}
cout << '\n';
}
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(_map[i][j] != 1) {
ret.push_back(dfs(i, j));
}
}
}
sort(ret.begin(), ret.end());
cout << ret.size() << "\n";
for(int _ret : ret) cout << _ret << "\n";
return 0;
}
/*
5 7 3
0 2 4 4
1 1 2 5
4 0 6 2
0 1 0 0 0 0 0
1 1 1 1 0 0 0
1 1 1 1 0 0 0
0 1 0 0 1 1 0
0 0 0 0 1 1 0
3
1
7
13
*/





