[白俊]#1941有名な七姫
16933 ワード
質問する
25人の女子学生で構成された女子クラスは5*5の正方形の格子の形で位置を決め、間もなく李多順と林道妍の2人の学生が頭角を現し、他の学生を振り回し始めた.すぐに、すべての女子学生は「李多順派」と「林多燕派」の2派に分裂し、やがて「林多燕派」は勢力を拡大し、「李多順派」を脅かし始めた.
危機意識を感じた「李多順派」の学生たちは、今の体制を果敢に放棄し、「有名な七姫」の誕生が唯一の生存手段であることに気づいた.「有名な七姫」は以下のルールを満たすべきです.
名前は
入力
「S」(「SOM」派の学生を表す)または「Y」(「任度」派の学生を表す)を値とする5*5行列には、1行目から5行目までの空白はありません.
しゅつりょく
1行目には「有名な七姫」を構成できるすべての状況の数字が出力されます.
入力例1
YYYYY
SYSYS
YYYYY
YSYYS
YYYYY
サンプル出力1
2
に答える
この問題はbfs(幅優先探索)アルゴリズムで解くことができる.
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Main {
static int ans = 0;
static int flag;
static char[][] map;
static int[] dx = {-1, 1, 5, -5}; //좌표 왼, 오, 아래, 위
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
map = new char[5][5];
for(int i=0; i<5; i++) {
String input = br.readLine();
for(int j=0; j<5; j++)
map[i][j] = input.charAt(j);
}
dfs(0, 0, 0, new boolean[25]);
System.out.println(ans);
}
public static void dfs(int idx, int cnt1, int cnt2, boolean[] visited) {
if(cnt1+cnt2==7) { //7개 선택 했을 때
if(cnt1>cnt2) { //이다솜파가 더 많을 때
flag = 1;
boolean[] v = new boolean[25];
v[idx-1] = true;
check(idx-1, visited, v);
if(flag==7)
ans++;
}
return;
}
for(int i=idx; i<25; i++) { //조합 선택
if(!visited[i]) {
visited[i] = true;
if(map[i/5][i%5]=='S')
dfs(i+1, cnt1+1, cnt2, visited);
else
dfs(i+1, cnt1, cnt2+1, visited);
visited[i] = false;
}
}
}
public static void check(int idx, boolean[] visited, boolean[] v) { //선택된 좌표들이 이어져 있는 지 확인
for(int i=0; i<4; i++) {
if((idx%5==0 && i==0) || (idx%5==4 && i==1)) continue;
int ndx = idx+dx[i];
if(ndx<0 || ndx>=25 || !visited[ndx] || v[ndx]) continue;
v[ndx] = true;
flag++;
check(ndx, visited, v);
}
}
}
Reference
この問題について([白俊]#1941有名な七姫), 我々は、より多くの情報をここで見つけました https://velog.io/@pss407/백준1941-소문난-칠공주テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol