[白俊]1941で有名な七姫(ジャワ)
質問する
全部で25人の女子学生で構成された女子学生のクラスは5です.×5の正方形の格子の位置が配置され、間もなく、李多順と林道妍の2人の学生が頭角を現し、他の学生を振り回し始めた.すぐに、すべての女子学生は「李多順派」と「林多燕派」の2派に分裂し、やがて「林多燕派」は勢力を拡大し、「李多順派」を脅かし始めた.
危機意識を感じた「李多順派」の学生たちは、今の体制を果敢に放棄し、「有名な七姫」の誕生が唯一の生存手段であることに気づいた.「有名な七姫」は以下のルールを満たすべきです.
名前は
入力
「S」(「SOM」派の学生を表す)または「Y」(「任度」派の学生を表す)を値とする5*5行列には、1行目から5行目までの空白はありません.
しゅつりょく
1行目には「有名な七姫」を構成できるすべての状況の数字が出力されます.
I/O例
に答える
コード#コード#
import java.io.*;
import java.util.*;
public class Main {
static char[][]arr = new char[5][5];
static boolean[] visited = new boolean[25];
static int[]selected=new int[7];
static int[]dx= {1,-1,0,0};
static int[]dy= {0,0,1,-1};
static int answer=0;
static void dfs(int depth,int start) {
if(depth==7){
if(check())answer++;
return;
}
for(int i=start;i<25;i++) {
if(!visited[i]) {
visited[i]=true;
selected[depth]=i;
dfs(depth+1,i+1);
visited[i]=false;
}
}
}
static boolean check() {
int Y=0;
for(int i:selected) {
if(arr[i/5][i%5]=='Y')Y++;
}
if(Y>3)return false;
ArrayList<Integer>temp = new ArrayList<>();
for(int a:selected)temp.add(a);
Queue<Integer> q= new LinkedList<>();
q.offer(selected[0]);
while(!q.isEmpty()) {
int i = q.poll();
for(int d=0;d<4;d++) {
int nx=i/5+dx[d];
int ny=i%5+dy[d];
if(nx>=0&&nx<5&&ny>=0&&ny<5){
if(temp.contains(nx*5+ny)) {
temp.remove(Integer.valueOf(nx*5+ny));
q.offer(nx*5+ny);
}
}
}
}
if(!temp.isEmpty())return false;
return true;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for(int i=0;i<5;i++) {
arr[i]=br.readLine().toCharArray();
}
dfs(0,0);
System.out.println(answer);
}
}
Reference
この問題について([白俊]1941で有名な七姫(ジャワ)), 我々は、より多くの情報をここで見つけました https://velog.io/@jihun333/백준1941-소문난-칠공주자바テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol