Programming Challenges – 그래픽 편집기 (Graphical Editor)

문제 <- 클릭

아무리 체크해봐도 답이 맞는데 틀렸다고 한다… 너무 이상해서 책의 모범답안을 똑같이 적어 제출 했더니 그래도 틀렸다고 한다;;
채점 로봇에 뭔가 문제가 있는건지… 아오 열받아..시간도 아깝고..

#include 
#include 
#include 

#define MAXNM 250
using namespace std;

class GraphicalEditor {
private:
	char field[MAXNM + 1][MAXNM + 1];
	int m, n;

	bool isValid(int x, int y) {
		if (1 <= x && x <= m && 1 <= y && y <= n)
			return true;
		return false;
	}

	char getPixel(int x, int y) {
		if (isValid(x, y))
			return field[y - 1][x - 1];
		return -1;
	}

	void L_setPixel(int x, int y, char color) {
		if (isValid(x, y))
			field[y - 1][x - 1] = color;
	}

	void V_verticalLine(int x, int y1, int y2, char color) {

		int high = std::max(y1, y2);
		int low = std::min(y1, y2);

		for (int i = low; i <= high; ++i) {
			L_setPixel(x, i, color);
		}
	}

	void H_horizonLine(int x1, int x2, int y, char color) {
		int high = std::max(x1, x2);
		int low = std::min(x1, x2);

		for (int i = low; i <= high; ++i) {
			L_setPixel(i, y, color);
		}
	}

	void K_square(int x1, int y1, int x2, int y2, char color) {
		int highX = std::max(x1, x2);
		int lowX = std::min(x1, x2);
		int highY = std::max(y1,y2);
		int lowY = std::min(y1,y2);
		for( int i = lowX; i<=highX; ++i){
			for(int j = lowY; j <= highY; ++j){
				L_setPixel(i,j,color);
			}
		}
	}

	void C_clear() {
		for (int i = 0; i < MAXNM + 1; ++i) {
			for (int j = 0; j < MAXNM + 1; ++j) {
				field[i][j] = 'O';
			}
		}
	}

	void F_fill(int x, int y, char color) {
		if (!isValid(x, y))
			return;
		int ninusX = x - 1;
		int plusX = x + 1;
		int ninusY = y - 1;
		int plusY = y + 1;
		char oldColor = getPixel(x, y);
		//	field[y - 1][x - 1] = color;
		L_setPixel(x, y, color);

		if (isValid(ninusX, y) && (getPixel(ninusX, y) == oldColor))
			F_fill(ninusX, y, color);
		if (isValid(x, ninusY) && (getPixel(x, ninusY) == oldColor))
			F_fill(x, ninusY, color);
		if (isValid(plusX, y) && (getPixel(plusX, y) == oldColor))
			F_fill(plusX, y, color);
		if (isValid(x, plusY) && (getPixel(x, plusY) == oldColor))
			F_fill(x, plusY, color);

	}

	void S_saveAndPrint(string& name) {
		cout << name << endl;
		for (int i = 0; i < n; ++i) {
			for (int j = 0; j < m; ++j) {
				cout<> m >> n;
		case 'C':
			C_clear();
			break;
		case 'L':
			cin >> intArg[0] >> intArg[1] >> charArg;
			L_setPixel(intArg[0], intArg[1], charArg);
			break;
		case 'V':
			cin >> intArg[0] >> intArg[1] >> intArg[2] >> charArg;
			V_verticalLine(intArg[0], intArg[1], intArg[2], charArg);
			break;
		case 'H':
			cin >> intArg[0] >> intArg[1] >> intArg[2] >> charArg;
			H_horizonLine(intArg[0], intArg[1], intArg[2], charArg);
			break;
		case 'K':
			cin >> intArg[0] >> intArg[1] >> intArg[2] >> intArg[3] >> charArg;
			K_square(intArg[0], intArg[1], intArg[2], intArg[3], charArg);
			break;
		case 'F':
			cin >> intArg[0] >> intArg[1] >> charArg;
			F_fill(intArg[0], intArg[1], charArg);
			break;
		case 'S':
			cin >> fileName;
			S_saveAndPrint(fileName);
			break;
		default:
			std::cin.ignore( std::numeric_limits::max(), 'n' );
			break;
		}
		return 1;
	}

};

int main() {

	char command = 0;
	GraphicalEditor ge;

	while ((cin >> command) && command != 'X') {
		if(!ge.inputCommand(command))
			break;
	}
	return 0;
}

3 thoughts on “Programming Challenges – 그래픽 편집기 (Graphical Editor)

  1. 채점을 잘못하는 경우도 있다고 합니다. 한번 uva에서 채점해 보심이…

    • 좋은 정보 감사 합니다 ^^

  2. 문제 링크 : http://uva.onlinejudge.org/external/102/10267.html 응시 유저 수 : 2406 해결한 유저 비율 : 59.06% 리전을 채우는 명령어인 F는 그림판에 있는 색 채우기를 생각하면 된다. 간단하게 구현한다면 재귀 호출(recursive call)이나 큐(queue)를 사용하면 된다. 난 queue를 사용해서 해결. 딱딱 명령어가 나누어져 있어서 유닛 테스트를 연습하기에 딱 좋쿠나. PS : 이거 예제..

답글 남기기

이메일 주소는 공개되지 않습니다.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.