arr[k >> 5] |= (1 << (k & 31));
arr[k >> 3] |= (1 << (k & 7));
'Coding > CPP 삽질기' 카테고리의 다른 글
Quick sort (0) | 2017.07.13 |
---|---|
가장 넓은 직사각형 구하는 알고리즘 ( O(MN) ) (0) | 2016.04.13 |
printf로 디버깅 하기 (0) | 2016.04.13 |
arr[k >> 5] |= (1 << (k & 31));
arr[k >> 3] |= (1 << (k & 7));
Quick sort (0) | 2017.07.13 |
---|---|
가장 넓은 직사각형 구하는 알고리즘 ( O(MN) ) (0) | 2016.04.13 |
printf로 디버깅 하기 (0) | 2016.04.13 |
가장 넓은 직사각형 구하는 알고리즘 ( O(MN) )
/* From : http://stackoverflow.com/questions/7245/puzzle-find-largest-rectangle-maximal-rectangle-problem */ int findMaxRect (int rect[XSIZE][YSIZE]) { int ret = 0; unsigned int x = 0, y = 0, k = 0; int sum[YSIZE+1] = { 0, }; int stack[YSIZE][2] = { 0, }; int stIdx = -1; int width = 0; int y0 = 0, w0 = 0, tempArea = 0; for ( x = 0; x < XSIZE; ++x ) { for ( y = 0; y <= YSIZE; ++y ) { sum[y] = rect[y][x] ? ++sum[y] : 0; } sum[YSIZE] = 0; width = 0; stIdx = -1; for ( y = 0; y <= YSIZE; ++y) { if ( sum[y] > width ) { stack[++stIdx][0] = y; stack[ stIdx][1] = width; width = sum[y]; } else if ( sum[y] < width ) { while(1) { y0 = stack[stIdx ][0]; w0 = stack[stIdx--][1]; tempArea = width * (y - y0); ret = tempArea > ret ? tempArea : ret; width = w0; if( sum[y] >= width) break; } width = sum[y]; if ( width != 0 ) { stack[++stIdx][0] = y0; stack[ stIdx][1] = w0; } } } } return ret; }
Bit 연산 정리 (0) | 2016.08.20 |
---|---|
printf로 디버깅 하기 (0) | 2016.04.13 |
C++ 컴파일러 (0) | 2016.03.30 |
#define DEBUG
#ifdef DEBUG
#define cprintf(...) printf(__VA_ARGS__)
#else
#define cprintf(...)
#endif
가장 넓은 직사각형 구하는 알고리즘 ( O(MN) ) (0) | 2016.04.13 |
---|---|
C++ 컴파일러 (0) | 2016.03.30 |
Lambda function (1) | 2016.03.17 |
무료 C++ 컴파일러
1. 구름 IDE ( https://ide.goorm.io/ )
웹기반 IDE 이며, 기본 사용은 무료 이다.
웹 브라우져만 있으면 손쉽게 다양한 언어로 개발이 가능 하다.
2. C++ shell ( http://cpp.sh )
무료이며, 웹브라우져만 띄우면 짧은 코드를 쉽게 실행 할 수 있다.
3. Cygwin ( http://cygwin.com/install.html )
자세한 설명은 Cygwin 홈페이지를 참고하시면 됩니다.
4. Visual studio Express ( https://www.visualstudio.com/ko-kr/products/visual-studio-community-vs.aspx )
너무 유명하므로 설명은 생략 합니다.
printf로 디버깅 하기 (0) | 2016.04.13 |
---|---|
Lambda function (1) | 2016.03.17 |
Lambda function (0) | 2016.03.16 |
[ C++ Lambda 함수 설명 ]
https://msdn.microsoft.com/ko-kr/library/dd293608.aspx
https://msdn.microsoft.com/ko-kr/library/dd293599.aspx
http://en.cppreference.com/w/cpp/language/lambda
C++ 컴파일러 (0) | 2016.03.30 |
---|---|
Lambda function (0) | 2016.03.16 |
짝수만 출력하기 (0) | 2016.03.03 |
#include <iostream>
using namespace std;
int main()
{
int num = 2;
auto sum = [](int n) -> int{ return n*n; }(num);
cout << num << " " << sum << endl;
return 0;
}
2 4
Lambda function (1) | 2016.03.17 |
---|---|
짝수만 출력하기 (0) | 2016.03.03 |
Couple (0) | 2015.12.23 |
#include <iostream>
using namespace std;
int main()
{
for (int i = 0; i < 100; i++) {
i % 2 || cout << i << endl;
}
return 0;
}
Lambda function (0) | 2016.03.16 |
---|---|
Couple (0) | 2015.12.23 |
사각형 개수 구하기 (0) | 2014.11.12 |
#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
int IsSheBeautiful() { return (rand() % 101 > 99); }
int IsSheLikeMe() { return (rand() % 51 > 49); }
int MeetGirl(int count) {
int amIcouple = FALSE;
// printf ("%d : I meet a girl!\n", count);
if ( IsSheBeautiful() && IsSheLikeMe() ) {
amIcouple = TRUE;
}
return amIcouple;
}
int Process() {
int amIcouple = FALSE;
int count = 0;
while ( amIcouple == FALSE ) {
amIcouple = MeetGirl(++count);
}
printf ("I met %d girls\n", count);
return amIcouple;
}
int main(int argc, char **argv) {
printf("%s\n", Process() == TRUE ? "I am not a single!" : "I am a sigle");
return 0;
}
짝수만 출력하기 (0) | 2016.03.03 |
---|---|
사각형 개수 구하기 (0) | 2014.11.12 |
Mirror (0) | 2014.10.27 |
#include <stdio.h>
#define BLOCK 1
#define SIZE 5
int mirror[SIZE][SIZE] = {
{ 0, 0, 0, 0, 0},
{ 0, 1, 1, 1, 0},
{ 0, 1, 0, 1, 0},
{ 0, 1, 1, 1, 0},
{ 0, 0, 0, 0, 1},
};
int process(void);
int checkIsRect(int x, int y);
int main (int argc, char **argv) {
int count = process();
printf ("%d\n", count);
return 0;
}
int process(void) {
int count = 0;
int i = 0, j = 0;
for ( i = 0; i < SIZE; i++) {
for ( j = 0; j < SIZE; j++ ) {
if ( mirror[i][j] == BLOCK ) {
count += checkIsRect(j, i);
}
}
}
return count;
}
int checkIsRect(int posX, int posY) {
int count = 0;
int isEnd = 0;
int x = posX;
int y = posY;
int width = 0;
int height = 0;
int x2 = posX;
int y2 = posY;
//int width2 = 0;
//int height2 = 0;
/* Check Right -> Check Down */
do {
mirror[y][x] = 0;
x++;
width++;
} while (x < SIZE && mirror[y][x] == 1);
x--;
do {
mirror[y][x] = 0;
y++;
height++;
} while (y < SIZE && mirror[y][x] == 1);
y--;
/* Check Down -> Check Left */
do {
mirror[y2][x2] = 0;
y2++;
//height2++;
} while (y2 < SIZE && mirror[y2][x2] == 1);
y2--;
do {
mirror[y2][x2] = 0;
x2++;
//width2++;
} while (x2 < SIZE && mirror[y2][x2] == 1);
// Already mirror[y2][x2] == 0
// Because x == x2, y == y2
// No need to x2--;
if ( x == x2 && y == y2 && width >= 3 && height >= 3 ) {
count = 1;
}
//printf ("x: %d y: %d x2: %d y2: %d width: %d height: %d \n", x, y, x2, y2, width, height);
return count;
}
#include <stdio.h>
#define UP 0
#define RIGHT 1
#define DOWN 2
#define LEFT 3
#define MIRROR_1 1
#define MIRROR_2 2
#define SIZE 5
int mirror[SIZE][SIZE] = {
{ 0, 0, 0, 0, 2},
{ 0, 1, 0, 2, 0},
{ 0, 2, 0, 0, 1},
{ 0, 0, 0, 1, 0},
{ 0, 0, 0, 0, 1},
};
int process(int x, int y, int direction);
int main (int argc, char **argv) {
int count = process(0, 0, RIGHT);
printf ("%d\n", count);
return 0;
}
int process(int x, int y, int direction) {
int count = 0;
int isEnd = 0;
while ( isEnd == 0 && x >= 0 && x < SIZE && y >= 0 && y < SIZE) {
switch(direction) {
case UP:
while (y >= 0 && mirror[y][x] == 0) {
y--;
}
// printf ("Up %d %d\n", x, y);
break;
case RIGHT:
while (x < SIZE && mirror[y][x] == 0) {
x++;
}
// printf ("Right %d %d\n", x, y);
break;
case DOWN:
while (y < SIZE && mirror[y][x] == 0) {
y++;
}
// printf ("Down %d %d\n", x, y);
break;
case LEFT:
while (x >= 0 && mirror[y][x] == 0) {
x--;
}
// printf ("LEFT %d %d\n", x, y);
break;
default:
break;
}
if ( x >= 0 && x < SIZE && y >= 0 && y < SIZE ){
if ( mirror[y][x] == MIRROR_1 ) {
direction ^= 1;
count++;
} else if ( mirror[y][x] == MIRROR_2 ) {
direction ^= 3;
count++;
}
switch (direction) {
case UP : y--; break;
case RIGHT : x++; break;
case LEFT : x--; break;
case DOWN : y++; break;
}
//printf ("%d %d %d\n",direction, x, y);
} else {
isEnd = 1;
}
};
return count;
}
사각형 개수 구하기 (0) | 2014.11.12 |
---|---|
대칭행렬 (0) | 2014.10.24 |
Programming 실습 예제 (0) | 2014.03.28 |