カメラマンレベル2-4

13839 ワード

質問の概要:

秋になって、Kakaofriendsグループでハイキングに行きました.楽しい時間を過ごすために、最後に集合写真を撮って、カメラの前に一列に並んだ.しかし、誰もが望む構成が異なり、どの順番で設定するかを決めるのに時間がかかります.ニオはフロドと並んで立っていて、パイプに火をつけられたライアンはパイプから少なくとも3つ離れていることを望んでいる.写真を撮って帰る途中、武智はみんなの要求を満たす方法があるのではないかと考えた.すべての友人が自分の希望する条件を入力として受け取り、すべての条件が満たされている場合は、数字を計算するプログラムを作成します.
入力フォーマット
条件個数を表す整数nとn個の要素からなる文字列配列データを入力して与えます.dataの要素は同じ形式の文字列からなり,friendsごとに必要な条件はN~F=0である.制限条件は以下の通りです.
1 <= n <= 100
dataの要素は5文字からなる文字列です.各要素の条件は次のとおりです.
1番目と3番目の字は次の8つの字の1つです.{A、C、F、J、M、N、R、T}はそれぞれピッチ、CON、PRODO、JI、MOZY、ニオ、ライアン、救命輪を表す.最初の字は条件を出した友達で、3番目の字は相手です.最初の字と3番目の字はいつも違います.
2文字目はいつも~.
4番目の字は以下の3つの字の1つです.{=、<、>}は、それぞれ同じ、小さい、または超えを表す.
5番目の文字は0以上6以下の整数の文字型で、条件で与えられた間隔を表します.このとき、間隔は2つのfriends間の別のfriendsの数である.
出力フォーマット
すべての条件を満たす数を返します.
サンプルI/O
n data answer
2 ["N~F=0", "R~T>2"] 3648
2 ["M~C<2", "C~M>1"] 0
実装コード:
import java.lang.Math;

class Solution {
    private String[] people = {"A", "C", "F", "J", "M", "N", "R", "T"};
    private  boolean[] visited = new boolean[8];
    private int answer = 0;
    
    public int solution(int n, String[] data) {
        dts("", data);
        return answer;
    }
    public void dts(String names, String[] data){
        if(names.length() == 7){
            if(check(names, data)){
                answer++;
            }
            
            return;
        
        }
        for(int i = 0; i < 8; i++){
            if(!visited[i]){
                visited[i] = true;
                String name = names + people[i];
                dts(name, data);
                visited[i] = false;
            }
        }
    }
    
    public boolean check(String names, String[] datas){
        
        for(String data : datas){
            int index1 = names.indexOf(data.charAt(0));
            
            int index2 = names.indexOf(data.charAt(2));
            
            char op = data.charAt(3);
            
            int index = data.charAt(4) -'0';
            
            if(op == '='){
                if(!(Math.abs(index1-index2) == index + 1)){
                    return false;
                }
            }else if(op == '>'){
                if(!(Math.abs(index1-index2) > index + 1 )){
                    return false;
                }
            }else if(op == '<'){
                if(!(Math.abs(index1-index2) < index + 1)){
                    return false;
                }
            }
        }
         return true;
    }
}
コードの説明:
dfsを用いて実施した.アクセスにより、名前が重複しないようにします.また,dfsを考慮すると木と見なすことができる.
Depthの後ろに横に行くとforゲートとしてだから初めてifゲートを回すのはnameslength()=7これをdepthと考えればいい値が7の場合にチェックします.