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 |
댓글