Skip to content

Conversation

@g0rnn
Copy link
Collaborator

@g0rnn g0rnn commented Jul 22, 2025

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

์†Œ๋ฌธ๋‚œ ์น ๊ณต์ฃผ

โœ”๏ธ ์†Œ์š”๋œ ์‹œ๊ฐ„

1h

โœจ ์ˆ˜๋„ ์ฝ”๋“œ

์ฒ˜์Œ์—” ๊ณจ๋“œ3์ธ ๊ฒƒ ์น˜๊ณ  ์‰ฌ์›Œ์„œ ๋นจ๋ฆฌ ํ’€๊ณ  ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ์†Œ๊ฐœํ•˜๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฒ˜์Œ ์ ‘๊ทผ์ด ๋„ˆ๋ฌด๋‚˜ ์ž˜๋ชป๋˜๋‹ค๋ณด๋‹ˆ.. ์‹œ๊ฐ„์„ ๋งŽ์ด ์“ฐ๊ฒŒ ๋˜์—ˆ๊ณ  ๋˜ ๊ทธ๋ ‡๊ฒŒ ์‰ฌ์šด๊ฒƒ ๊ฐ™์ง€๋„ ์•Š์•„์„œ ๊ณต์œ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ „ ํ…ŒํŠธ๋ฆฌ์Šค ๋ฌธ์ œ ๊ธฐ์–ตํ•˜์‹œ๋‚˜์š”? dfs๋กœ 5๊ฐœ์˜ ํ…ŒํŠธ๋ฆฌ์Šค ๋ชจํ˜•์„ ๋งŒ๋“ค๊ณ  ์–ด์ฉŒ๊ตฌ ์ €์ฉŒ๊ตฌ ํ–ˆ๋˜๊ฑฐ.. ๊ฐ‘์ž๊ธฐ ์ด ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ๊ทธ ๋ฐฉ๋ฒ•์ด ๋– ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค. dfs๋กœ 7๊ฐœ์˜ ์นธ์„ ๋งŒ๋“ค๊ณ  'S'์˜ ๊ฐœ์ˆ˜๊ฐ€ 4๊ฐœ ์ด์ƒ์ธ์ง€ ์ฒดํฌํ–ˆ์Šต๋‹ˆ๋‹ค. dfs๋กœ ์ธ์ ‘ํ•œ ์นธ์„ ์ ‘๊ทผํ–ˆ์œผ๋‹ˆ ๋‹น์—ฐํžˆ ์—ฐ์†ํ•˜๊ตฌ์š”. ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ํ…Œ์ผ€๋„ ํ†ต๊ณผ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค... ๊ธฐ๋ณธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ํžŒํŠธ๋ฅผ ๋ณด๋‹ˆ ์•„๋ž˜์˜ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ์ด๊ฑด dfs๋กœ๋Š” ์ ˆ๋Œ€๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๋ชจํ˜•์ด์ฃ ..^^; ์ด๊ฑธ ๋‚ฉ๋“ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.!

image

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผํ• ๊นŒ์š”? ์ •๋‹ต์€ ์กฐํ•ฉ์ž…๋‹ˆ๋‹น :)

์•„๋งˆ ๋‹ค๋“ค ์ ‘๊ทผ์€ ์กฐํ•ฉ์ผ ๊ฑฐ์˜ˆ์š”. ์กฐํ•ฉ์€ ์ž์ฃผ ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ ๋„˜์–ด๊ฐ€๊ณ , ์ธ์ ‘ํ•˜๋ฉด์„œ 'S'๊ฐ€ 4๊ฐœ ์ด์ƒ์ธ์ง€ ํ™•์ธํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ €๋Š” bfs๋กœ ๋‚ด๊ฐ€ ์„ ํƒํ•œ ์นธ๋งŒ ์ด๋™ํ•˜๋ฉด์„œ 'S'๊ฐ€ 4๊ฐœ ์ด์ƒ์ธ์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. bfs๋กœ ํ•˜๋‹ˆ๊นŒ ์—ฐ์†์ ์ธ๊ฑด ๋‹น์—ฐํ•˜๊ตฌ์š”.

๐Ÿ“š ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ

์ œ ํ’€์ด๋ฅผ ๋ณด๋ฉด select์— ์ด์ƒํ•œ ๊ฐ’์„ ๋„ฃ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฑด ์ €๋ฒˆ ๋ฆฌ๋ทฐํ•˜๋ฉด์„œ ์ผ๋˜ ๋ฐฉ์‹์ธ๋ฐ N * N ๋ฐฐ์—ด์— 0๋ถ€ํ„ฐ N*N - 1๊นŒ์ง€์˜ ์ˆ˜๋ฅผ ์ฑ„์šฐ๊ณ  ๋ฐฐ์—ด์˜ ๊ฐ’์„ N์œผ๋กœ ๋‚˜๋ˆ„๊ณ  N์œผ๋กœ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•˜๋ฉด ํ–‰๊ณผ ์—ด์˜ index๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15

[13] -> {3, 1}
13 / 4 = 3, 13 % 4 = 1 

์‹ค์ˆ˜ํ•˜๋ฉด ์•ˆ๋˜๋Š”๊ฑด 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค!!

Copy link
Collaborator

@wnsmir wnsmir left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

5 by 5๋Š” ์ด๋ฏธ ์ •ํ•ด์ง„ ์‚ฌ์‹ค์ด๋ผ ์™„์ „ํƒ์ƒ‰์˜ ๋ฐฉํ–ฅ์œผ๋กœ ์ ‘๊ทผํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•œ์นธ์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ์ƒํ•˜์ขŒ์šฐ์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์˜์ˆ˜๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ ์ž˜๋ชป๋๋‹ค๋Š”๊ฑธ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

bfs๋ฅผ ๊ฒฐ๊ตญ ๊ฒฝ์šฐ์˜์ˆ˜๋งŒํผ ๋‹ค ๋Œ๋ ค๋ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฆ‰ ๋ฐ˜๋Œ€๋กœ์ƒ๊ฐํ•ด๋ณด๋ฉด

์กฐํ•ฉ์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘๊ณ , bfs๋กœ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด์–ด์ ธ์žˆ๋Š”์ง€ ํ™•์ธ์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ตฌํ˜„์€ ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค! ์‹ ์„ ํ•œ ๋ฌธ์ œ๋„ค์š”!!

from itertools import combinations
from collections import deque

board = [list(input().strip()) for _ in range(5)]
ans = 0
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]

def is_connected(cands):
    q = deque([cands[0]])
    visited = set([cands[0]])
    cands_set = set(cands)
    while q:
        cur = q.popleft()
        x, y = cur // 5, cur % 5
        for d in range(4):
            nx, ny = x+dx[d], y+dy[d]
            if 0<=nx<5 and 0<=ny<5:
                nxt = nx*5+ny
                if nxt in cands_set and nxt not in visited:
                    visited.add(nxt)
                    q.append(nxt)
    return len(visited) == 7

for cands in combinations(range(25), 7):
    S_cnt = sum(1 for idx in cands if board[idx//5][idx%5]=='S')
    if S_cnt >= 4 and is_connected(cands):
        ans += 1

print(ans)

Copy link
Collaborator

@kangrae-jo kangrae-jo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ฒ˜์Œ์— ์ €๋„ ๊ท ํ˜ธ๋‹˜์ฒ˜๋Ÿผ dfs ๋กœ ์ ‘๊ทผํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ณจ๋“œ 3 ๋ฌธ์ œ๋ฅผ 20๋ถ„๋งŒ์—?? ํ•˜๋ฉด์„œ ์ œ์ถœํ–ˆ๋Š”๋ฐ...
ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค. ๊ฐ€ ๋œจ๋”๋ผ๊ตฌ์š”.

๊ท ํ˜ธ๋‹˜ ๋ง๋Œ€๋กœ ํ…Œ์ผ€์—์„œ ์ฃผ์–ด์ง„ ๋‹ต 2๊ฐœ๋„ dfs๋กœ๋Š” ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ํ˜•ํƒœ๋”๊ตฐ์š”.
๊ทธ๋ž˜์„œ ์ €๋„ bfs๋กœ 25๊ฐœ์ค‘ 7๊ฐœ๋ฅผ ๋ฝ‘๊ณ , ๊ทธ 7๊ฐœ ์ž๋ฆฌ๊ฐ€ ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ด๋‹ค์†œ์”จ์˜ ํŒŒ๊ฐ€ 4์ธ ์ด์ƒ ์ธ์ง€๋ฅผ ๊ฒ€์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์กฐํ•ฉ์€ ์ €ํฌ๊ฐ€ ์›Œ๋‚™ ๋งŽ์ดํ•ด์„œ ๋น ๋ฅด๊ฒŒ ํ–ˆ์ง€๋งŒ, ์กฐ๊ฑด๊ฒ€์‚ฌ๊ฐ€ ์ƒ๊ฐ๋ณด๋‹ค ๊นŒ๋‹ค๋กญ๋”๊ตฐ์š”.

๊ฐ„๋‹จํžˆ ํ•˜๊ณ  ์‹ถ์€ ๋งˆ์Œ์— visited๋‚˜ selected ๊ฒ€์‚ฌ๋„ ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ dir์„ ํ†ตํ•ด ์ด๋™ํ•œ y_, x_๊ฐ€ candi์— ์žˆ์œผ๋ฉด ์—ฐ๊ฒฐ๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์–ด์š”.
๊ทผ๋ฐ ์ด ๋ฐฉ์‹์€ ๋‘๋ช… ๋‘๋ช… ์„ธ๋ช… ์ด๋ ‡๊ฒŒ ๋–จ์–ด์ ธ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋„ ๊ท ํ˜ธ๋‹˜์ด๋ž‘ ๊ฑฐ์˜ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„์„ ํ•œ ๊ฒƒ ๊ฐ™์•„์š”.
์žฅ๋ณด๊ณ ๊ฐ‘๋‹ˆ๋‹ค.

#include <iostream>
#include <queue>
#include <string>
#include <vector>

using namespace std;

const int N = 5;
const int M = 5;
const int OFFSET[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};

vector<string> board(N);

bool isVaild(vector<int>& candi) {
    vector<bool> visited(7, false);
    queue<int> q;
    q.push(0); 
    visited[0] = true;

    int Y = 0, cnt = 0;
    while (!q.empty() && ++cnt) {
        int now = q.front(); 
        q.pop();

        int y = candi[now] / N;
        int x = candi[now] % M;

        if (board[y][x] == 'Y') Y++;

        for (int dir = 0; dir < 4; dir++) {
            int y_ = y + OFFSET[dir][0];
            int x_ = x + OFFSET[dir][1];
            for (int i = 0; i < 7; i++) {
                if (!visited[i] && y_ == candi[i] / N && x_ == candi[i] % M) {
                    visited[i] = true;
                    q.push(i);
                }
            }
        }
    }
    return cnt == 7 && Y < 4;
}

int comb(vector<int>& candi, int k) {
    if (candi.size() == 7) {
        if (isVaild(candi)) return 1;
        return 0;
    }

    int cnt = 0;
    for (int index = k; index < N * M; index++) {
        candi.push_back(index);
        cnt += comb(candi, index + 1);
        candi.pop_back();
    }
    return cnt;
}

int main() {
    for (int y = 0; y < N; y++) {
        cin >> board[y];
    }

    vector<int> candi;
    cout << comb(candi, 0) << '\n';

    return 0;
}

Copy link
Member

@9kyo-hwang 9kyo-hwang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋Œ€์ถฉ ๋ณด๊ณ  "์Œ ๋ฐฑํŠธ๋ž˜ํ‚น ๋”ธ๊นํ•˜๋ฉด ๋˜๊ฒ ๋„ค"ํ•˜๊ณ  ๋‘๋‹ค๋‹ค๋‹ค 10๋ถ„ ์ฝ”๋“œ ์งœ๊ณ  ์ œ์ถœํ–ˆ๋Š”๋ฐ 11% ์ฒ ํ‡ด ใ…‹ใ…‹ ์ €๋งŒ ๊ทธ๋Ÿฐ ๊ฒŒ ์•„๋‹ˆ์—ฌ์„œ ์•ˆ๋„...

๋‹ค์‹œ ๋ฌธ์ œ ์˜ˆ์‹œ๋ฅผ ๋ณด๋‹ˆ๊นŒ,

.....
SYSYS
.Y...
.S...
.....

์ด ๊ฒฝ์šฐ๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์—†๋Š” ๋ชจ์–‘์ด๋”๊ตฐ์š”. ์™œ ํ…ŒํŠธ๋ฆฌ์Šค ์กฐ๊ฐ ์–˜๊ธฐ ํ•˜์…จ๋Š”์ง€ ๋”ฑ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

์žฌ๊ท€ ํƒ์ƒ‰์„ ํ•˜๋ฉด์„œ ์กฐ๊ฑด์— ๋งž๋Š” ํฌ๊ธฐ๊ฐ€ 7์ธ ์—ฐ๊ฒฐ ์š”์†Œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๊ฑฐ๊พธ๋กœ ๊ฐ€๋Šฅํ•œ ์—ฐ๊ฒฐ ์š”์†Œ๋ฅผ ๋‹ค ํ›‘์–ด๋ณธ ๋’ค ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์นด์šดํŒ…ํ•˜๋Š” ์‹์œผ๋กœ ์ ‘๊ทผํ–ˆ์Šต๋‹ˆ๋‹ค.

์›๋ž˜๋Š” next_permutation์„ ์จ์„œ ์ฝ”๋“œ๋ฅผ ๊ธˆ๋ฐฉ ์งฐ๋Š”๋ฐ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ ค์„œ ์งฑ๊ตฌ๋ฅผ ๋” ๊ตด๋ ค๋ดค์Šต๋‹ˆ๋‹ค. ์ตœ์ดˆ์— ํ•œ ๋ฒˆ ๊ฐ ์นธ๋งˆ๋‹ค "์ธ์ ‘ํ•œ ์นธ" ์ •๋ณด๋ฅผ ๋ฏธ๋ฆฌ ์บ์‹ฑํ•˜๋ฉด ๋˜๊ฒ ๋”๋ผ๊ตฌ์š”. ๊ทธ๋ž˜์„œ ์ธ์ ‘์นธ ๊ฒ€์‚ฌ ๋ถ€๋ถ„์ด ๊ฐ„๊ฒฐํ•ด์กŒ๋„ค์š” ใ…Ž

#include <bits/stdc++.h>

using namespace std;

array<char, 25> board;
vector<int> adj[25];
array<bool, 25> selected;

bool IsConnectedComponent() {
    queue<int> q;
    array<bool, 25> visited = {false, };
    
    for(int i = 0; i < 25; ++i) {
        if(selected[i]) {
            q.emplace(i);
            visited[i] = true;
            break;
        }
    }
    
    int count = 1;
    while(!q.empty()) {
        int u = q.front();
        q.pop();
        
        for(int v : adj[u]) {
            if(selected[v] && !visited[v]) {
                visited[v] = true;
                q.emplace(v);
                ++count;
            }
        }
    }
    
    // ๊ณผ๋ฐ˜์ž„์€ Combination ํ•จ์ˆ˜์—์„œ ์—ฌ๊ธฐ๋กœ ๋“ค์–ด์˜ฌ ๋•Œ ์ด๋ฏธ ๋ณด์žฅ๋œ ์ƒํƒœ. ๋”ฐ๋ผ์„œ 7๊ฐœ ์นธ์ด ์—ฐ๊ฒฐ๋๋Š”์ง€๋งŒ ํ™•์ธ
    return count == 7;
}

int Combination(int index = 0, int student = 0, int dasom = 0) {
    if(dasom + (7 - student) < 4) {  // ๋‚จ์€ ๋ชจ๋“  ํ•™์ƒ์ด ์ด๋‹ค์†œ ํŒŒ๊ฐ€ ๋˜์–ด๋„ ๊ณผ๋ฐ˜์ด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ
        return 0;
    }
    
    if(student == 7) {
        return IsConnectedComponent();
    }
    
    int ans = 0;
    for(int i = index; i < 25; ++i) {
        selected[i] = true;
        ans += Combination(i + 1, student + 1, dasom + (board[i] == 'S'));
        selected[i] = false;
    }
    
    return ans;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    for(int i = 0; i < 5; ++i) {
        string row; cin >> row;
        for(int j = 0; j < 5; ++j) {
            board[i * 5 + j] = row[j];
        }
    }
    
    for (int i = 0; i < 25; i++) {
        int r = i / 5, c = i % 5;
        
        // ์ƒํ•˜์ขŒ์šฐ ์ธ์ ‘ํ•œ ์นธ
        if (r > 0) adj[i].emplace_back(i-5);
        if (r < 4) adj[i].emplace_back(i+5);
        if (c > 0) adj[i].emplace_back(i-1);
        if (c < 4) adj[i].emplace_back(i+1);
    }
    
    cout << Combination();

    return 0;
}

Copy link
Collaborator

@kokeunho kokeunho left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์Šคํฌ ๋‹นํ•ด์„œ ์กฐํ•ฉํ•œ ํ›„์— bfs๋กœ ํ‘ธ๋Š” ๊ฒƒ์„ ์•Œ์•„๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋ชฐ๋ž๋”๋ผ๋ฉด ์ €๋„ dfs๋กœ ์‹œ๋„ํ•ด๋ณด๋‹ค ์‹คํŒจํ–ˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ž…์ถœ๋ ฅ ์˜ˆ์‹œ์˜ ๊ฒฝ๋กœ๋ฅผ dfs๋กœ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์กฐํ•ฉ์œผ๋กœ ์šฐ์„  7๋ช…์„ ๊ณ ๋ฅด๊ณ 
bfs ์‹œ์ž‘ ์ง€์ (๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ selected ์ง€์ )์„ ์ฐพ์€ ๋’ค
ํ•ด๋‹น ์ง€์ ์—์„œ bfs๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ selected ๋œ ์ง€์ ๋“ค ๊ฒฝ๋กœ๋กœ ํ™•์ธํ•˜๋ฉด์„œ
๊ฒฝ๋กœ๊ฐ€ ์ด 7์นธ์ธ์ง€, ์ด๋‹ค์†œํŒŒ๊ฐ€ 4๋ช… ์ด์ƒ์ธ์ง€ ์ฒดํฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค~

Details

import java.util.*;

public class Main {
    static char[][] map = new char[5][5];
    static boolean[][] selected = new boolean[5][5];
    static boolean[][] visited = new boolean[5][5];
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    static int totalCount = 0;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        for (int i = 0; i < 5; i++) {
            String line = sc.nextLine();
            for (int j = 0; j < 5; j++) {
                map[i][j] = line.charAt(j);
            }
        }
        sevenPrincesses(0, 0, 0);

        System.out.print(totalCount);
    }
    static void sevenPrincesses(int row, int col, int count) {
        if (row == 5 || count == 7) {
            if (count == 7) startBfs();
            return;
        }
        int newCol = (col + 1) % 5;
        int newRow = row;
        if (newCol == 0) newRow++;

        selected[row][col] = true;
        sevenPrincesses(newRow, newCol, count+1);
        selected[row][col] = false;
        sevenPrincesses(newRow, newCol, count);
    }
    static void startBfs() {
        for (int i = 0; i < 5; i++) {
            Arrays.fill(visited[i], false);
        }
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if(selected[i][j]) {
                    bfs(i, j);
                    return;
                }
            }
        }
    }
    static void bfs(int x, int y) {
        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[]{x, y});
        visited[x][y] = true;
        int sCount = 0, yCount = 0;

        while (!queue.isEmpty()) {
            int[] current = queue.poll();
            int cx = current[0], cy = current[1];
            if (map[cx][cy] == 'S') {
                sCount++;
            } else yCount++;

            for (int i = 0; i < 4; i++) {
                int nx = cx + dx[i];
                int ny = cy + dy[i];
                if (nx >= 0 && nx < 5 && ny >= 0 && ny < 5
                        && !visited[nx][ny] && selected[nx][ny]) {
                    visited[nx][ny] = true;
                    queue.add(new int[]{nx, ny});
                }
            }
        }
        if (sCount+yCount==7 && sCount >= 4) totalCount++;
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants