๐Ÿ’œ๊ฐœ๋ฐœ๊ณผ ์ผ์ƒ (โ‰ง∇โ‰ฆ)๏พ‰

[๋ฐฑ์ค€ c++] 1030 ํ”„๋ ‰ํƒˆํ‰๋ฉด (๊ณจ3) ๋ณธ๋ฌธ

CS/๋ฐฑ์ค€

[๋ฐฑ์ค€ c++] 1030 ํ”„๋ ‰ํƒˆํ‰๋ฉด (๊ณจ3)

๊ฐ•์˜์„œ 2023. 10. 2. 13:17

๐Ÿ“Œ ๋ฌธ์ œ

 

https://www.acmicpc.net/problem/1030

 

1030๋ฒˆ: ํ”„๋ ‰ํƒˆ ํ‰๋ฉด

์ฒซ์งธ ์ค„์— 7๊ฐœ์˜ ์ •์ˆ˜ s, N, K, R1, R2, C1, C2๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค...

ํ•„์ž๋Š” ๋ณด๋“œ๋ฅผ ๊ด€์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.

๋ณด๋“œ์˜ ๋ชจ๋“  ํ”„๋ ‰ํƒˆ ํ‰๋ฉด ๊ตฌ์กฐ๋ฅผ ๋‹ค ํƒ์ƒ‰ํ•˜๋ฉด์„œ R1, R2, C1, C2 ๋‚ด์— ํ•ด๋‹น๋˜๋ฉด ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถœ๋ ฅ ์ด์ฐจ์› ๋ฐฐ์—ด์„ ์„ ์–ธํ–ˆ์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์ด ์•„๋‹Œ ๋“ฏ ํ•˜๋‹ค.

 

๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ์ฐธ์กฐํ•ด๋ณด๋‹ˆ ํ•ด๋‹น R1, R2, C1, C2๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ํ•ด๋‹น ์นธ๋“ค์ด ์ƒ‰์น ๋˜๋Š” ์นธ์ธ์ง€๋ฅผ ํ™•์ธํ–ˆ๋‹ค...

ใ… ใ…  ์ฒ˜์Œ๋ถ€ํ„ฐ ์ ‘๊ทผ์„ ์ž˜ ๋ชปํ•œ ๊ฒƒ์ด์—ˆ๋‹ค.

๋ฌธ์ œ ํ’€๋ฉด์„œ ๋ถ€๋ถ„๋งŒ ์ถœ๋ ฅํ•˜๋ผ๋Š” ์กฐ๊ฑด์„ ๋ณด๋ฉด ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ–ˆ์–ด์•ผํ–ˆ๋Š”๋ฐ.....

๋‹ค๋ฅธ ๋ถ„๋“ค ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ํ†ต๊ณผ๋ฅผ ํ–ˆ๋‹ค.

 

 

#include <iostream>
#include <cmath>

using namespace std;

int S, N, K;
int R1, C1, R2, C2; // (C1,R1) ~ (C2,R2) ๊ณ„์‚ฐํ•˜๊ธฐ

int MAX;
int outSizeY, outSizeX;

//์ถœ๋ ฅ ๊ฐ’
bool board[51][51];

//์ฒ˜์Œ์— ์ œ๋Œ€๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•˜๋‹ค

void Recursive(int Nsize, int t, int X, int Y) {

	//Nsize ํ˜„์žฌ ์ฒดํฌํ•˜๊ณ  ์žˆ๋Š” ๋‚˜๋ˆ„๋ ค๊ณ  ํ•˜๋Š” ๋ฐ•์Šค์˜ ํฌ๊ธฐ
	//t ํ˜„์žฌ ์‹œ๊ฐ„
	//X, Y ํ•ด๋‹น ๋ฐ•์Šค๊ฐ€ ์‹œ์ž‘ํ•˜๋Š” ์™ผ์ชฝ ์œ„์— ์ฝ”๋“œ

	cout << Nsize << " " << t << " " << X << " " << Y << "ํƒ์ƒ‰์ค‘" << endl;

	//Ksize ์ •์‚ฌ๊ฐํ˜•์˜ ์ค‘๊ฐ„ ๊ฐ’์˜ ํฌ๊ธฐ๋ฅผ scale์— ๋”ฐ๋ผ์„œ ๊ณ„์‚ฐํ•˜๊ธฐ
	int Ksize = K * pow(N, S - t);

	//๊ฐ€์šด๋ฐ ๊ณ„์‚ฐ =>  ํ•ด๋‹น Nsize์˜ ์ •์‚ฌ๊ฐํ˜• ๊ธฐ์ค€ ์ค‘๊ฐ„ ๊ฐ’์˜ ์œ„, ์•„๋ž˜ ๊ฐ’ ๊ณ„์‚ฐ
	int middleL = (Nsize - Ksize) / 2; // ์ž‘์€
	int middleR = (Nsize + Ksize) / 2; // ํฐ

	//cout << Ksize << " " << middleL << " " << middleR << endl;

	//๋‚ด๊ฐ€ ์ถœ๋ ฅํ•˜๋Š” ๋ถ€๋ถ„์ด
	//๊ฐ€์šด๋ฐ์— ํ•ด๋‹นํ•˜๋Š” ์นธ์ด ํ•ด๋‹น ์นธ์— ํ•ด๋‹นํ•˜๋Š”์ง€ ํ™•์ธ.
	for (int i = middleL + Y; i < middleR + Y; i++) {
		if (R1 > i || R2 < i) continue;

		for (int j = middleL + X; j < middleR + X; j++) {
			if (C1 > j || C2 < j) continue;

			//๋ฒ”์œ„์— ํ•ด๋‹นํ•œ๋‹ค๋ฉด ์ƒ‰์น ํ•˜๊ธฐ
			board[i - R1][j - C1] = true;
		}
	}


	//์„ธ๋ถ„ํ™” ์ข…๋ฃŒ ์‹œ, return 0
	if (S == t) return;

	//์ธ๋ฑ์Šค ์„ธ๋ถ„ํ™” ํ›„์—, ๋ถ„ํ•  ์ •๋ณตํ•˜๊ธฐ
	//์™ผ์ชฝ ์œ„
	
	int NsizeDiv = Nsize/N;
	
	//์œ„์ชฝ ๋ผ์ธ ํƒ์ƒ‰
	
	if(C1 < X + Nsize && R1 < Y ){
	    for (int i = Y; i < Y + middleL; i+= NsizeDiv) {
		    for (int j = X; j < X + Nsize ; j+= NsizeDiv)
			    Recursive(Nsize / N, t + 1, j, i);
		}
	
	}
	
	
	
	

	//๊ฐ€์šด๋ฐ ํƒ์ƒ‰
	for (int i = Y + middleL; i < Y + middleR; i+= NsizeDiv) {

		//์™ผ์ชฝ ํƒ์ƒ‰
		for (int j = X; j < X + middleL; j += NsizeDiv ) {
			Recursive(Nsize / N, t + 1, j, i);
		}

		//์˜ค๋ฅธ์ชฝ ํƒ์ƒ‰
		for (int j = X + middleR; j < X + Nsize; j+= NsizeDiv) {
			Recursive(Nsize / N, t + 1, j, i);
		}
	}

	//์•„๋ž˜์ชฝ ๋ผ์ธ ํƒ์ƒ‰
	for (int i = Y + middleR; i < Y + Nsize; i+= NsizeDiv) {
		for (int j = X; j < X + Nsize; j+= NsizeDiv) {
			Recursive(Nsize / N, t + 1, j, i);
		}
	}
}

int main() {

	//input
	cin >> S >> N >> K >> R1 >> R2 >> C1 >> C2;
	outSizeY = R2 - R1 + 1;
	outSizeX = C2 - C1 + 1;
	MAX = pow(N, S);

	//Recursive
	Recursive(MAX, 1, 0, 0);

	//output
	for (int i = 0; i < outSizeY; i++) {
		for (int j = 0; j < outSizeX; j++) {
			cout << board[i][j];
		}
		cout << endl;
	}

	return 0;
}