본문 바로가기
Algorithms/simulation

Square

by OKOK 2020. 1. 9.

Square

 

제한시간: 0 ms    메모리제한: 0 MB

 

아래 코드를 분석하여 정사각형의 개수를 구하는 recoq함수를 작성하시오.

 

//--------------user.cpp---------------
int recog(unsigned char image[64][64])
{
    int ans = 0;
 
    return ans;
}
 
 
//--------------main.cpp---------------
#include <cstdio> 
const int SIZE = 64;
int COUNT, SCORE;
int seed = 1117;
 
unsigned char image[SIZE][SIZE];
 
extern int recog(unsigned char image[SIZE][SIZE]);
static int pseudo_rand(void) {
    seed = seed * 214013 + 2531011;
    return (seed >> 16) & 0x7FFF;
}
 
void rect() {
    int sx, sy, ex, ey, tmp;
    while (true) {
        sx = pseudo_rand() % SIZE;
        ex = pseudo_rand() % SIZE;
        sy = pseudo_rand() % SIZE;
        ey = pseudo_rand() % SIZE;
 
        if (sx > ex) {
            tmp = sx;
            sx = ex;
            ex = tmp;
        }
 
        if (sy > ey) {
            tmp = sy;
            sy = ey;
            ey = tmp;
        }
        if (ex - sx < 9) continue;
        if (ey - sy < 9) continue;
        break;
    }
    for (register int y = sy; y <= ey; y++)
        for (register int x = sx; x <= ex; x++)
            image[y][x]++;
    if (ex - sx == ey - sy) {
        COUNT++;
    }
 
}
 
void _build() {
    for (int y = 0; y < SIZE; y++)
        for (int x = 0; x < SIZE; x++)
            image[y][x] = 0;
    COUNT = 0;
    for (int i = 0; i < 50; i++) rect();
}
 
int main() {
 
    SCORE = 0;
    int TC = 100;
    for (int T = 0; T < TC; T++)
    {
        _build();
        //output();
        int userans = recog(image);
        if (userans == COUNT) SCORE++;
        printf("%d %d\n", userans, COUNT);
    }
    if (SCORE >= 7000)
        printf("PASS\n");
    else
        printf("FAIL\n");
    printf("RESULT: %d\n", SCORE); 
    return 0;
}
//main.c
#include <cstdio> 
const int SIZE = 64;
int COUNT, SCORE;
int seed = 1117;

unsigned char image[SIZE][SIZE];

extern int recog(unsigned char image[SIZE][SIZE]);
extern void output();

static int pseudo_rand(void) {
	seed = seed * 214013 + 2531011;
	return (seed >> 16) & 0x7FFF;
}

void rect() {
	int sx, sy, ex, ey, tmp;
	while (true) {
		sx = pseudo_rand() % SIZE;
		ex = pseudo_rand() % SIZE;
		sy = pseudo_rand() % SIZE;
		ey = pseudo_rand() % SIZE; // 시작 점과 끝점을 랜덤으로 선정 맵 안에서

		if (sx > ex) {
			tmp = sx;
			sx = ex;
			ex = tmp;
		}

		if (sy > ey) {
			tmp = sy;
			sy = ey;
			ey = tmp;
		}
		if (ex - sx < 9) continue; // 사이즈가 9이상이다 무적권
		if (ey - sy < 9) continue;
		break;
	}
	for (register int y = sy; y <= ey; y++)
	for (register int x = sx; x <= ex; x++)
		image[y][x]++; // 겹쳐서 + 함
	if (ex - sx == ey - sy) { // 정사각형의 개수를 카운트 하는구만
		COUNT++;
	}

}

void _build() {
	for (int y = 0; y < SIZE; y++) // 초기화를 하고
	for (int x = 0; x < SIZE; x++)
		image[y][x] = 0;
	COUNT = 0;
	for (int i = 0; i < 50; i++) rect(); // 50개를 만듬
}

void output(unsigned char arr[][SIZE])
{
	printf("\n"); printf("\n");
	for (int y = 0; y < SIZE; y++){
		for (int x = 0; x < SIZE; x++){
			printf("%d	", arr[y][x]);
		}
		printf("\n");
	}
}

int main() {
	freopen("output.txt", "w", stdout);
	SCORE = 0;
	int TC = 1;
	for (int T = 0; T < TC; T++)
	{
		_build();

		output(image);
		int userans = recog(image);
		if (userans == COUNT) SCORE++;
		//printf("%d %d\n", userans, COUNT);
	}
	if (SCORE >= 7000)
		printf("PASS\n");
	else
		printf("FAIL\n");
	printf("RESULT: %d\n", SCORE);
	return 0;
}
// user.cpp
int cnt[66][66], map[66][66];

int chk(int sy, int sx)
{
	for (int ey = sy + 10, ex = sx + 10; ey < 66 && ex < 66; ey++, ex++) {
		if (map[ey][ex] <= 0 || map[sy][ex] >= 0 || map[ey][sx] >= 0) continue; // square가 있다는 
		map[sy][sx]--, map[ey][ex]--, map[sy][ex]++, map[ey][sx]++;
		return 1;
	}
	return 0;
}

int recog(unsigned char image[64][64])
{
	int ans = 0;
	for (int i = 0; i < 64; i++) {
		for (int j = 0; j < 64; j++) {
			cnt[i + 1][j + 1] = image[i][j]; // 하나씩 밀어서 계산, 좌측 상단을 비워둬야 함
		}
	}
	for (int i = 1; i <= 65; i++) {
		for (int j = 1; j <= 65; j++) {
			map[i][j] = cnt[i - 1][j - 1] + cnt[i][j] - cnt[i][j - 1] - cnt[i - 1][j];
		}
	}



	for (int i = 1; i <= 65; i++) {
		for (int j = 1; j <= 65; j++) {
			if (map[i][j] > 0) ans += chk(i, j); // map 이 1 이상이면 모서리임
		}
	}
	return ans;
}

'Algorithms > simulation' 카테고리의 다른 글

진법 변환  (0) 2020.01.10
비밀편지  (0) 2020.01.09
연속부분합 찾기  (0) 2020.01.09
기수정렬(Radix Sort)  (0) 2020.01.09
책꽂이 만들기  (0) 2020.01.09

댓글