๐Ÿ“ Coding Test Study/Algorithm Problem

[C++][Baekjoon][BFS ํƒ์ƒ‰] 2206๋ฒˆ ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ ์ƒ์„ธ ํ•ด์„ค

ibelieveinme 2021. 10. 16. 03:20
728x90

[๋ฌธ์ œ]

 

 

2206๋ฒˆ: ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ

N×M์˜ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋Š” ๋งต์ด ์žˆ๋‹ค. ๋งต์—์„œ 0์€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ด๊ณ , 1์€ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ๋ฒฝ์ด ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹น์‹ ์€ (1, 1)์—์„œ (N, M)์˜ ์œ„์น˜๊นŒ์ง€ ์ด๋™ํ•˜๋ ค ํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ตœ๋‹จ ๊ฒฝ๋กœ

www.acmicpc.net

N×M์˜ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋œ ๋งต์—์„œ (1, 1)์—์„œ (N, M)๊นŒ์ง€ ์ด๋™ํ•  ๋•Œ ๊ฑธ๋ฆฌ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ.

์ด ๋•Œ, 0์€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ด๊ณ , 1์€ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ๋ฒฝ์ด ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ 1ํšŒ์— ํ•œํ•˜์—ฌ ๋ฒฝ์„ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

[ํ’€์ด]

Break ์œ ๋ฌด๋ฅผ ์ €์žฅํ•ด๋†“๊ณ  ํ•œ๋ฒˆ๋„ ๊นฌ ์  ์—†๋Š” ๋ฒฝ์„ ๊นจ๊ฐ€๋ฉด์„œ ํƒ์ƒ‰ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์€๋ฐ ๊ทธ ๊ตฌ์กฐ๋ฅผ ๋ชป์งœ๊ฒ ์–ด์„œ ํ•œ์ฐธ์„ ํ—ค๋งธ๋‹ค.

๊ฒฐ๊ตญ ํ’€์ด ์ฐธ์กฐ...

 

์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ํƒ์ƒ‰ํ•œ ๊ฒฝ๋กœ๋ฅผ queue์— ์ €์žฅํ•  ๋•Œ, ๋ฒฝ์„ ๋ถ€์ˆœ ๊ฒฝ๋กœ์ธ์ง€ ๋ฒฝ์„ ๋ถ€์ˆ˜์ง€ ์•Š์€ ๊ฒฝ๋กœ์ธ์ง€๋„ ์ €์žฅํ•ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ๋˜ํ•œ, ํƒ์ƒ‰ํ•œ ๊ฒฝ๋กœ๋ฅผ ๋ฐฉ๋ฌธ์ฒดํฌํ•  ๋•Œ ๋ฒฝ์„ ๋ถ€์ˆœ ์ ์ด ์žˆ์œผ๋ฉด์„œ ๋ฐฉ๋ฌธํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๋ฒฝ์„ ๋ถ€์ˆœ์ ์ด ์—†์œผ๋ฉด์„œ ๋ฐฉ๋ฌธํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ชจ๋‘ ์—ด์–ด๋‘๊ณ  ํ•œ ๊ฒฝ์šฐ๋งŒ ๋ฐฉ๋ฌธ ์ฒดํฌํ•ด์ค˜์•ผํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

 

์ด ๋•Œ, ๋ฒฝ์„ ๋ถ€์ˆœ ์ ์ด ์žˆ๋‹ค๋ฉด ๋ฒฝ์ด ์•„๋‹Œ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์†ํ•ด์„œ ์ด๋™ํ•˜๋ฉด ๋˜๊ณ , ๋ฒฝ์„ ๋ถ€์ˆœ ์ ์ด ์—†๋‹ค๋ฉด ๋ฒฝ๊ณผ ๋ฒฝ์ด ์•„๋‹Œ ๊ณณ ๋ชจ๋‘  ์ด๋™๊ฐ€๋Šฅํ•˜๋‹ค.

 

์ฆ‰, ๊ฐ ์ ๋“ค์€ ์ขŒํ‘œ์™€ ๋ฒฝ์„ ๋ถ€์ˆœ ํšŸ์ˆ˜, ์ด๋™ ํšŸ์ˆ˜ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด๋™ ํšŸ์ˆ˜ ์ •๋ณด๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ๊ธธ์ด๋ฅผ ์ฐพ์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ €์žฅํ•ด์คฌ๋‹ค. ํƒ์ƒ‰ํ•  ๋•Œ๋งˆ๋‹ค +1์”ฉํ•ด์„œ ๊ฒฝ๋กœ ๊ธธ์ด๋ฅผ ์ฐพ๋Š”๋‹ค.

class Point {
public:
	int x;
	int y;
	int breakCount;//๋ฒฝ์„ ๋ถ€์ˆœ ํšŸ์ˆ˜. 0 or 1๋กœ ํ‘œํ˜„
	int count;//์ด๋™ ํšŸ์ˆ˜. ๋‚˜์ค‘์— ์ถœ๋ ฅํ•ด์ค˜์•ผ ํ•จ.
	Point(int x, int y, int breakCount, int count) {
		this->x = x;
		this->y = y;
		this->breakCount = breakCount;
		this->count = count;
	}
};

๊ทธ๋ฆฌ๊ณ  ๋ฒฝ์„ ๋šซ์€ ์ ์ด ์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ•˜๋ฉฐ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋ฒฝ์„ ๋šซ์€ ์  ์—†๋Š” ๊ฒฝ๋กœ๊ฐ€ ๋ฐฉ๋ฌธ์ฒดํฌํ•˜๋ฉฐ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ. 2๊ฐ€์ง€๋กœ ๋‚˜๋‰˜๊ธฐ ๋•Œ๋ฌธ์— visited  ๋ฐฐ์—ด์„ 2๊ฐœ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค. ๊ทธ ๋ฐฐ์—ด์€ 3์ฐจ์› ํ–‰๋ ฌ๋กœ ํ‘œํ˜„ํ–ˆ๋‹ค. ๋ฒฝ์„ ๋šซ์€ ์  ์—†์œผ๋ฉด์„œ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด visited[x][y][0] = true๋กœ, ๋ฒฝ์„ ๋šซ์€ ์  ์žˆ์œผ๋ฉด์„œ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด visited[x][y][1] = true ๋กœ ์ฒดํฌํ•  ๊ฑฐ๋‹ค.

bool visited[MAX_VALUE][MAX_VALUE][2] = { false, };

 

 

์—ฌ๊ธฐ์„œ ์งˆ๋ฌธ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. (๋‚˜๋„ ๊ณ„์† ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ”๋˜ ๋ถ€๋ถ„!!) ๋ฒฝ์„ ๋šซ์„ ๋•Œ, ํ•ญ์ƒ ์ตœ์„ ์ด ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋šซ์–ด์•ผ ํ•  ํ…๋ฐ, ์•ž์—์„œ ๋šซ์€ ๊ฒฝ์šฐ๋ณด๋‹ค ๋’ค์—์„œ ๋šซ์€ ๊ฒฝ์šฐ๊ฐ€ ๋” ์ตœ์„ ์ด๋ฉด ์–ด๋–กํ•˜์ง€????

 

๊ฒฐ๋ก ์€ ์ƒ๊ด€์—†๋‹ค !!! ๋’ค์— ๋‚˜์˜ค๋Š” ์ตœ์„ ์˜ ๊ฒฝ์šฐ๋Š” ๋ฒฝ์„ ๋šซ์€ ์  ์—†๋Š” ๊ฒฝ๋กœ๊ฐ€ ์žฌํƒ์ƒ‰ํ•ด์ค„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค !!!!!

์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉฐ ์ดํ•ดํ•ด๋ณด์ž.

 

์˜ˆ์ œ 1๋ฒˆ์„ ํ’€์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

queue์— ์ €์žฅ๋˜๋Š” ์ธ์ž 3๊ฐœ๋Š” Point์ •๋ณด๋ฅผ ์˜๋ฏธํ•˜๋Š”๋ฐ ์ˆœ์„œ๋Œ€๋กœ Point(x์ขŒํ‘œ, y์ขŒํ‘œ, ๋ฒฝ์„ ๋ถ€์ˆœ ํšŸ์ˆ˜)์ด๋‹ค.

์ฆ‰, ๋งจ ์ฒ˜์Œ์— ํ์— ์ €์žฅ๋˜๋Š” ๊ฐ’์€ x์ขŒํ‘œ 1, y์ขŒํ‘œ 1, ๋ฒฝ์„ ๋ถ€์ˆœ ํšŸ์ˆ˜ 0์„ ์ €์žฅํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  (1, 1)๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ, ์•„๋ž˜, ์™ผ์ชฝ, ์œ„ ์ˆœ์œผ๋กœ ์ฃผ๋ณ€์„ ํƒ์ƒ‰ํ•œ๋‹ค.

(1, 1) ์ฃผ์œ„ ์ขŒํ‘œ์ธ (1, 2)์™€ (2, 1)์„ ํƒ์ƒ‰ํ•˜๋Š”๋ฐ, ์•„์ง ๋ฒฝ์„ ๋ถ€์ˆœ ํšŸ์ˆ˜๊ฐ€ 0์ด๋ฏ€๋กœ ๋ฒฝ์„ ๋งŒ๋‚ฌ์„ ๋•Œ ๋ฒฝ์„ ๋ถ€์ˆ  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฒฝ์„ ๋ถ€์ˆ˜๊ณ  ๋‹ค์Œ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•  ๊ฒƒ์ด๋‹ค. ์ฆ‰, visited[1][2][1] = visited[2][1][1] = true๋กœ ๋ฐฉ๋ฌธ ์ฒดํฌํ•ด์ฃผ๊ณ  queue์— Point(1, 2, 1)๊ณผ Point(2, 1, 1)์„ ๋„ฃ๋Š”๋‹ค.

 

๋‹ค์Œ queue์˜ ๋งจ ์•ž์— ์žˆ๋Š” Point(1, 2, 1)์„ ๊บผ๋‚ด์„œ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•  ๊ฑด๋ฐ,

์ด๋ฏธ ์•ž์—์„œ ๋ฒฝ์„ ๋ถ€์ˆœ ์ ์ด ์žˆ์œผ๋ฏ€๋กœ(3๋ฒˆ์งธ ์ธ์ž๊ฐ€ 1์ด๋ฏ€๋กœ) ๋‹ค์Œ ๊ฒฝ๋กœ์—์„  ๋ฒฝ์ด ์•„๋‹Œ ๊ฒฝ๋กœ(map[x][y] = 0)๋งŒ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฒฝ์„ ๋ถ€์ˆœ ์ ์ด ์žˆ์œผ๋ฏ€๋กœ breakedCount๋ฅผ +1 ํ•ด์ค€ ์ƒํƒœ์ธ Point(1, 3, 1) ๋ฅผ queue์— ์ €์žฅํ•˜๊ณ  ๋ฒฝ์„ ๋ถ€์ˆ˜๊ณ  ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋กœ visited[1][3][1] = true๋กœ ๋ฐฉ๋ฌธ ์ฒดํฌ ํ•ด์ค€๋‹ค.

๊ทธ ๋’ค๋กœ๋„ ๋ฒฝ์„ ๋ถ€์ˆ  ์ˆ˜ ์žˆ๋Š” ํšŸ์ˆ˜๊ฐ€ 0์ด๋ฏ€๋กœ ๋ฒฝ์ด ์•„๋‹Œ ๊ฒฝ๋กœ๋งŒ ํƒ์ƒ‰ํ•˜๋ฉฐ (N, M) ์ขŒํ‘œ์— ๋„๋‹ฌํ•  ๊ฒƒ์ด๋‹ค.

 

๋‹ค๋ฅธ ์˜ˆ์ œ๋„ ์‚ดํŽด๋ณด์ž.

์œ„ ์˜ˆ์ œ๋Š” ๋งจ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฒฝ์„ ๋šซ์ง€ ์•Š๋Š”๋‹ค. ๋ฒฝ์„ ๋šซ๊ฑฐ๋‚˜ ๋šซ์ง€ ์•Š์œผ๋ฉด์„œ N x M ์œ„์น˜๊นŒ์ง€ ๊ฐ€๋Š” ๊ฑฐ๋‹ค.

 

Point(1, 1, 0) ์ขŒํ‘œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ , Point(1, 2, 0) ์ขŒํ‘œ์™€ Point(2, 1, 0) ์ขŒํ‘œ๋ฅผ ํ์— ๋„ฃ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  visited[1][2][0] = visited[2][1][0] = true๋กœ ๋ฐฉ๋ฌธ ์ฒดํฌํ•œ๋‹ค. ์•„์ง ๋ฒฝ์„ ๋šซ์€ ์ ์ด ์—†์œผ๋ฏ€๋กœ ๋‘ ์ขŒํ‘œ ๋ชจ๋‘ 3๋ฒˆ์งธ ์ธ์ž(๋ฒฝ์„ ๋šซ์€ ํšŸ์ˆ˜)๋Š” 0์ด์ด๊ณ  ๋ฒฝ์„ ๋šซ์ง€ ์•Š๊ณ  ์ด๋™ํ•œ ๊ฒฝ๋กœ์— ๋ฐฉ๋ฌธ์ฒดํฌํ•ด์ฃผ๋Š” ๊ฑฐ๋‹ค.

 

๋‹ค์Œ queue์˜ ์ œ์ผ ์•ž์— ์žˆ๋Š” ์ขŒํ‘œ์ธ Point(1, 2, 0)๋ฅผ ํƒ์ƒ‰ํ•˜์ž. ์ด ๋•Œ๋Š” (1, 3)์ขŒํ‘œ์™€ (2, 2)์ขŒํ‘œ๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, (1, 3)์ขŒํ‘œ๋กœ ์ด๋™ํ•  ๊ฒฝ์šฐ๋Š” ๋ฒฝ์„ ๋šซ์ง€ ์•Š๊ณ  ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ณ , (2, 2)์ขŒํ‘œ๋กœ ์ด๋™ํ•  ๋•Œ๋Š” ๋ฒฝ์„ ๋šซ์–ด์•ผ๋งŒ ์ด๋™ ๊ฐ€๋Šฅ ํ•˜๋‹ค. Point(1, 2, 0) ๊ฐ’์˜ 3๋ฒˆ์งธ ์ธ์ž๋ฅผ ํ†ตํ•ด ์ด ๊ฒฝ๋กœ๋Š” ๋ฒฝ์„ ๋šซ์€ ์ ์ด ์—†์œผ๋ฏ€๋กœ ๋‘ ์ขŒํ‘œ ๋ชจ๋‘ queue์— ์ €์žฅํ•œ๋‹ค. ์ด ๋•Œ, (1, 3)์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ๋Š” ๋ฒฝ์„ ๋šซ์€ ์  ์—†์œผ๋ฏ€๋กœ Point(1, 3, 0)์˜ ๊ฐ’์„, (2, 2)๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ๋Š” ๋ฒฝ์„ ๋šซ์–ด์•ผ ํ•˜๋ฏ€๋กœ Point(2, 2, 1)๋กœ ํ‘œํ˜„ ๋ฐ queue์— ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  visited[1][3][0] = visited[2][2][1] =  true ๋กœ ๊ฐ๊ฐ ๋ฒฝ์„ ๋šซ์€ ์  ์—†์œผ๋ฉด์„œ ๋ฐฉ๋ฌธํ•œ ๊ฒฝ๋กœ์™€ ๋ฒฝ์„ ๋šซ์œผ๋ฉด์„œ ๋ฐฉ๋ฌธํ•œ ๊ฒฝ๋กœ๋ฅผ ๋ฐฉ๋ฌธ์ฒดํฌํ•ด์ค€๋‹ค.

๋‹ค์Œ queue์˜ ๋งจ ์•ž์˜ ๊ฐ’์ธ Point(2, 1, 0)์„ ํƒ์ƒ‰ํ•˜์ž. Point(2, 1, 0)์˜ ๊ฐ’์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“œ์‹œ ์ง€๊ธˆ๊นŒ์ง€ ๋ฒฝ์„ ๋šซ์€ ์ ์—†๋Š” ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•œ ๊ฒƒ์ด๋‹ค. ์•„์ง ๋ฒฝ์„ ๋šซ์€ ์ ์ด ์—†์œผ๋ฏ€๋กœ (2, 2)์ขŒํ‘œ์™€ (3,1)์ขŒํ‘œ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•  ํ…๋ฐ, (2, 2) ์ขŒํ‘œ๋กœ ์ด๋™ํ•  ๊ฒฝ์šฐ ๋ฒฝ์„ ๋šซ์€ ์  ์žˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. Point(2, 2, 1) ์ด๋ ‡๊ฒŒ. ๊ทผ๋ฐ (2, 2, 1)์€ ์ด๋ฏธ (1, 2)์ขŒํ‘œ์—์„œ ํƒ์ƒ‰ํ•  ๋•Œ visited[2][2][1] = true๋กœ ์ฒดํฌํ•ด์ฃผ๊ณ  queue์— ๋„ฃ์–ด์คฌ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฏธ ์ด๋ฒˆ ๊ฒฝ๋กœ์—์„œ๋Š” Point(3, 1, 0)๋งŒ ์ €์žฅํ•˜๊ณ  ๋ฒฝ์„ ๋šซ์€ ์  ์—†์œผ๋ฉด์„œ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋กœ visited[3][1][0] = true ๋กœ ์ฒดํฌํ•ด์ค€๋‹ค.

 

๊ทธ ๋‹ค์Œ์€ Point(1,3,0)๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค. (1, 4) ์ขŒํ‘œ์™€, (2, 3) ์ขŒํ‘œ๋ฅผ ํƒ์ƒ‰ํ•  ํ…๋ฐ, (1, 4)์ขŒํ‘œ๋Š” ๋ฒฝ์ด ์•„๋‹Œ ๊ฒฝ๋กœ๋ฅผ ์ฒดํฌํ•˜๋Š” ๋ฐฐ์—ด์— ๋ฐฉ๋ฌธ์ฒดํฌํ•ด์ฃผ๊ณ , (2, 3)์ขŒํ‘œ๋Š” ๋ฒฝ์„ ๋šซ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฒฝ์ธ ๊ฒฝ๋กœ๋ฅผ ์ฒดํฌํ•˜๋Š” ๋ฐฐ์—ด์— ๋ฐฉ๋ฌธ์ฒดํฌํ•ด์ค€๋‹ค. ์ฆ‰ visited[1][4][0] = visited[2][3][1] = true์ด๊ณ , queue์— Point(1, 4, 0)๊ณผ Point(2, 3, 1) ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค.

Point(2, 2, 1)์€ ๋ฒฝ์„ ๋ถ€์ˆœ ์  ์žˆ๋Š” ์ด๋™๊ฒฝ๋กœ ์ด๋ฏ€๋กœ visited[2][3][1] = visited[3][2][1]= true๋กœ ์ฒดํฌํ•ด์ฃผ๊ณ , Point(2, 3, 1)๊ณผ Point(3, 2, 1)์„ queue์— ๋„ฃ๋Š”๋‹ค.

 

Point(3, 1, 0)์€ ๋ฒฝ์„ ๋ถ€์ˆœ ์  ์—†๋Š” ์ด๋™๊ฒฝ๋กœ ์ด๋ฏ€๋กœ visited[3][2][0] = visited[4][1][0] = true๋กœ ์ฒดํฌํ•ด์ฃผ๊ณ  queue์— Point(3, 2, 0)๊ณผ Point(4, 1, 0)์„ ๋„ฃ์–ด์ค€๋‹ค.

 

์—ฌ๊ธฐ์„œ queue์— Point(3, 2, 1)๊ณผ Point(3, 2, 0)์ด ์žˆ๋Š” ๊ฒƒ์ด ๋ณด์ผ ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฒฝ์„ ๋ถ€์ˆ˜๋ฉฐ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒฝ๋กœ์™€ ๋ฒฝ์„ ๋ถ€์ˆ˜์ง€ ์•Š๊ณ  ํƒ์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋‘˜๋‹ค๋ฅผ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜ ๋‹ค์˜ ๊ฒฝ์šฐ์—์„œ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ ๋’ค๋กœ ์œ„ ๊ณผ์ •์„ ๊ณ„์† ๋ฐ˜๋ณตํ•œ๋‹ค.

queue์˜ ๊ฐ’์ด ๋ชจ๋‘ ๋น ์ง€๊ณ  ํ˜„์žฌ ์ขŒํ‘œ๊ฐ€ (N,M)์ด ๋˜๋ฉด ํ˜„์žฌ๊นŒ์ง€ ๊ตฌํ•œ ๊ฒฝ๋กœ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค!

 

[์ฝ”๋“œ]

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;

const int MAX_VALUE = 1001;
int direction[4][2] = { {0,1}, {1,0},{0,-1},{-1,0} };//์ด๋™ ๋ฐฉํ–ฅํ‚ค: ์˜ค๋ฅธ์ชฝ, ์•„๋ž˜, ์™ผ์ชฝ, ์œ„

class Point {
public:
	int x;
	int y;
	int breakCount;//๋ฒฝ์„ ๋ถ€์ˆœ ํšŸ์ˆ˜. 0 or 1๋กœ ํ‘œํ˜„
	int count;//์ด๋™ ํšŸ์ˆ˜. ๋‚˜์ค‘์— ์ถœ๋ ฅํ•ด์ค˜์•ผ ํ•จ.
	Point(int x, int y, int breakCount, int count) {
		this->x = x;
		this->y = y;
		this->breakCount = breakCount;
		this->count = count;
	}
};

int MoveByBFS(int N, int M, int map[MAX_VALUE][MAX_VALUE]);//BFS๋ฅผ ํ†ตํ•œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์ฐพ๊ธฐ ์ˆ˜ํ–‰

int main() {
	int N, M;
	cin >> N >> M;
	int map[MAX_VALUE][MAX_VALUE] = { 0, };
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			scanf_s("%1d", &map[i][j]);
		}
	}
	cout << MoveByBFS(N, M, map);
	return 0;
}


int MoveByBFS(int N, int M, int map[MAX_VALUE][MAX_VALUE]) {
	queue<Point> q;
	bool visited[MAX_VALUE][MAX_VALUE][2] = { false, }; 

	q.push(Point(0,0,0,1));
	visited[0][0][0] = true;//๋ฒฝ์„ ๋ถ€์ˆœ ํšŸ์ˆ˜๊ฐ€ 0์ด๋ฉด์„œ ํ•ด๋‹น ์ขŒํ‘œ์— ๋ฐฉ๋ฌธํ–ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ„
	visited[0][0][1] = true;//๋ฒฝ์„ ๋ถ€์ˆœ ํšŸ์ˆ˜๊ฐ€ 1์ด๋ฉด์„œ ํ•ด๋‹น ์ขŒํ‘œ์— ๋ฐฉ๋ฌธํ–ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ„

	while (!q.empty()) {
		Point currentPoint = q.front();
		q.pop();

		if (currentPoint.x == N - 1 && currentPoint.y == M - 1) {
			return currentPoint.count;
		}
		for (int i = 0; i < 4; i++) {
			int nx = currentPoint.x + direction[i][0];
			int ny = currentPoint.y + direction[i][1];
			if (nx < N && nx >= 0 && ny < M && ny >= 0) {
				if (!visited[nx][ny][0]) {//๋ฒฝ ๋ถ€์ˆœ ํšŸ์ˆ˜๊ฐ€ 0์ด๋ฉด์„œ ํ•ด๋‹น ์ขŒํ‘œ์— ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋Š” ๊ฒฝ์šฐ
					if (map[nx][ny] == 0 && currentPoint.breakCount == 0) {//ํ•ด๋‹น ์ขŒํ‘œ์— ๋ฒฝ์ด ์—†๊ณ  ์ด์ „๊นŒ์ง€ ๋ฒฝ ๋ถ€์ˆœ ํšŸ์ˆ˜๋„ 0์ผ ๊ฒฝ์šฐ๋งŒ push
						visited[nx][ny][0] = true;
						q.push(Point(nx, ny, 0, currentPoint.count + 1));
					}
				}
				if (!visited[nx][ny][1]) {//๋ฒฝ ๋ถ€์ˆœ ํšŸ์ˆ˜๊ฐ€ 1์ด๋ฉด์„œ ํ•ด๋‹น ์ขŒํ‘œ์— ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋Š” ๊ฒฝ์šฐ
					if ((map[nx][ny] == 1 && currentPoint.breakCount == 0)//ํ•ด๋‹น ์ขŒํ‘œ์— ๋ฒฝ์ด ์žˆ๊ณ  ๋ฒฝ ๋ถ€์ˆœ ํšŸ์ˆ˜๊ฐ€ 0์ธ ๊ฒฝ์šฐ
							|| (map[nx][ny] == 0 && currentPoint.breakCount == 1)) {//or ํ•ด๋‹น ์ขŒํ‘œ์— ๋ฒฝ์ด ์—†๊ณ  ๋ฒฝ ๋ถ€์ˆœ ํšŸ์ˆ˜๊ฐ€ 1์ธ ๊ฒฝ์šฐ
						visited[nx][ny][1] = true;
						q.push(Point(nx, ny, 1, currentPoint.count + 1));
					}
				}
			}
		}
	}
	return -1;
}
728x90