회원가입
로그인
Toggle navigation
문제
문제
전체 문제
문제 출처
단계별로 풀어보기
알고리즘 분류
추가된 문제
문제 순위
문제
푼 사람이 한 명인 문제
아무도 못 푼 문제
최근 제출된 문제
최근 풀린 문제
랜덤
출처
ICPC
Olympiad
한국정보올림피아드
한국정보올림피아드시․도지역본선
전국 대학생 프로그래밍 대회 동아리 연합
대학교 대회
카카오 코드 페스티벌
Coder's High
ICPC
Regionals
World Finals
Korea Regional
Africa and the Middle East Regionals
Europe Regionals
Latin America Regionals
North America Regionals
South Pacific Regionals
문제집
대회
2
채점 현황
랭킹
게시판
그룹
더 보기
재채점 기록
블로그
강의
실험실
도움말
BOJ Stack
BOJ Book
전체
공지
자유
질문
오타/오역/요청
게시판 공지
홍보
업데이트
solved.ac
글쓰기
질문 도움말
자주묻는 질문
주석O)수많은 시도로 고친 끝에 모든 입력에 답이 나온다고 생각했는데
16924번 - 십자가 찾기
glyph
1년 전
0
채점중 1%에서 틀렸습니다가 나옵니다..
뭔가 사소한 것을 놓치고 있는 것 같은데 그게 뭔지 도무지 모르겠네요;
#include <iostream> #include <vector> using namespace std; int dx[5] = {0, 0, 0, -1, 1}; int dy[5] = {0, -1, 1, 0, 0}; int main(){ int N, M; //맵 크기 int map[101][101]; bool check[101][101]; //십자가로 별을 처리했는지 여부 확인 char x; //값 입력시 쓰는 일회용 변수 int cnt = 0; //중상하좌우 확인할 때 별의 갯수 int level = 1; //십자가의 크기 int star = 0; //십자가만으로 별을 모두 처리가능한지 여부 vector<int> X; //십자가가 성립하는 행 중심좌표 vector<int> Y; //십자가가 성립하는 열 좌표 vector<int> LEV; //십자가가 성립할 때, 십자가의 크기 + 1 vector<int> alpha; //별이 존재하는 map의 행 좌표 vector<int> beta; //별이 존재하는 map의 열 좌표 cin >> N >> M; for(int i = 0; i < N; i++){ for(int j = 0; j < M; j++){ cin >> x; if(x == '.'){ map[i][j] = 0; //별이 아니면 0 } else if(x == '*'){ map[i][j] = 1; //별이면 1 check[i][j] = false; //아직 십자가처리 안했으므로 false alpha.push_back(i); //map에서 별의 위치 저장 beta.push_back(j); } } } for(int i = 0; i < N; i++){ for(int j = 0; j < M; j++){ //맵 전체 순회 if(map[i][j] != 1){ continue; } level = 1; //한 중심점 처리 후 십자가 크기 초기화 cnt = 0; //한 중심점 처리 후 중상하좌우 별 개수 초기화 for(int k = 0; k < 5; k++){ //중상하좌우 별 체크 //if(level > 1) cout << "현재 level = " << level << endl; if((i + (level * dx[k]) >= 0) && (i + (level * dx[k]) <= N) && (j + (level * dy[k]) >= 0) && (j + (level * dy[k]) <= M)) { //범위 제한 조건식 if(map[i + (level * dx[k])][j + (level * dy[k])] == 1){ cnt++; //중상하좌우 별 있으면 count } if(cnt == 5){//일단 크기 1이라도 십자가가 만들어지는 경우 level++; //크기 확장 cnt = 0; //중상하좌우 별 갯수 초기화 k = -1; //다시 중상하좌우 확인 } else if(level > 1 && k == 4){//더이상 십자가를 만들 수 없는 경우 X.push_back(i + 1); Y.push_back(j + 1); LEV.push_back(level - 1); cnt = 0; check[i][j] = true; for(int a = 1; a < level; a++){ for(int b = 0; b < 5; b++){ check[i + (a * dx[b])][j + (a * dy[b])] = true; //십자가로 중상하좌우 별 처리했음을 확인 } } } //범위 제한 조건식 } //중상하좌우 별 체크 } //맵 전체 순회 } } //별 중에 가능한 십자가 모두 true로 바꿨음에도 false가 남은 경우 for(int i = 0; i < alpha.size(); i++){ if(check[alpha[i]][beta[i]] == false){ //cout << alpha[i] + 1 << " " << beta[i] + 1<< endl; cout <<"-1\n"; star = 1; break; } } //십자가로 모두 별을 처리한 경우 if(star != 1){ cout << X.size() << "\n"; for(int i = 0; i < X.size(); i++){ cout << X[i] << " " << Y[i] << " " << LEV[i] << "\n"; } } return 0; }
댓글을 작성하려면
로그인
해야 합니다.
glyph 1년 전
채점중 1%에서 틀렸습니다가 나옵니다..
뭔가 사소한 것을 놓치고 있는 것 같은데 그게 뭔지 도무지 모르겠네요;