백준 [1079] "마피아"

Kimbab1004·2024년 9월 2일
0

Algorithm

목록 보기
84/102

오답

#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>

using namespace std;

struct PLAYER {
	int score;
	int number;
	int Dead = false;

	bool operator<(const PLAYER& other) const {
		return score > other.score;
	}

};

int map[16][16];

int eunjin;
int n;

int result = 0;

vector<PLAYER> score;

void input() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		int a;
		cin >> a;
		score.push_back({ a,i });
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> map[i][j];
		}
	}

	cin >> eunjin;
}

//밤에는 마피아가 죽일 사람을 한 명 고른다.이 경우 각 사람의 유죄 지수가 바뀐다.만약 참가자 i가 죽었다면, 다른 참가자 j의 유죄 지수는 R[i][j]만큼 변한다.
//낮에는 현재 게임에 남아있는 사람 중에 유죄 지수가 가장 높은 사람을 죽인다.그런 사람이 여러 명일 경우 그중 번호가 가장 작은 사람이 죽는다.이 경우 유죄 지수는 바뀌지 않는다.

void solve(vector<PLAYER> _score, int day, int people) {
	//밤 일때
	if (people % 2 == 0) {
		//죽일 사람 1명을 랜덤으로 골러야함 (밤)
		for (int i = 0; i < n; i++) {
			vector<PLAYER> scoreCopy = _score;
			//은진이 본인이면 자살하는 거니까 안됨
			if (scoreCopy[i].number == eunjin) continue;
			//만약 이미 죽은 사람이여도 안됨
			if (scoreCopy[i].Dead == true) continue;

			//밤됐으니 카운트 증가
			int _day = day;
			_day++;
			result = max(_day, result);
			//밤에 죽임
			scoreCopy[i].Dead = true;
			//각 사람의 유죄 지수가 바뀐다.만약 참가자 i가 죽었다면, 다른 참가자 j의 유죄 지수는 R[i][j]만큼 변한다

			for (int z = 0; z < n; z++) {

				if (scoreCopy[z].Dead == true) continue;

				//i번째 참가자가 죽었으니 다른 참가자들 z의 유죄지수를 map[i][z] 만큼 변한다.
				scoreCopy[z].score += map[i][z];

			}
			solve(scoreCopy, _day, people - 1);
			scoreCopy[i].Dead = false;
		}
	}

	//낮 일때
	else {
		//낮
		//유죄 지수가 높은 순서대로 정렬

		vector<PLAYER> scoreCopy = _score;

		sort(scoreCopy.begin(), scoreCopy.end());
		//그런데 만약 유죄 지수가 가장 높은 사람의 번호가 은진이면 다음 검사를 하지 않음
		if (scoreCopy[0].number != eunjin) {
			//젤 높은 애가 은진이가 아니다.
			//이놈 죽이고 다음 밤 검사
			scoreCopy[0].Dead = true;
			solve(scoreCopy, day,people-1);
		}
		else {
			return;
		}
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	input();
	solve(score,0, n);

	cout << result;

	return 0;
}

정답 출처

#include<iostream>
 
#define endl "\n"
#define MAX 20
using namespace std;
 
struct INFO
{
    int Score;
    bool LIVE;
};
 
bool Flag;
int N, Mafia_Idx, Answer;
int Score_Board[MAX][MAX];
INFO Player[MAX];
 
int Min(int A, int B) { if (A < B) return A; return B; }
int Bigger(int A, int B) { if (A > B) return A; return B; }
 
void Input()
{
    cin >> N;
    for (int i = 0; i < N; i++)
    {
        cin >> Player[i].Score;
        Player[i].LIVE = true;
    }
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cin >> Score_Board[i][j];
        }
    }
    cin >> Mafia_Idx;
}
 
void DFS(int PN, int Day)
{
    if (Flag == true) return;
    if (Player[Mafia_Idx].LIVE == false || PN == 1)
    {
        Answer = Bigger(Answer, Day);
        if (PN == 1 && Player[Mafia_Idx].LIVE == true) Flag = true;
        return;
    }
    
    if (PN % 2 == 0)
    {
        for (int i = 0; i < N; i++)
        {
            if (i == Mafia_Idx) continue;
            if (Player[i].LIVE == false) continue;
 
            Player[i].LIVE = false;
            for (int j = 0; j < N; j++)
            {
                if (Player[j].LIVE == false) continue;
                Player[j].Score = Player[j].Score + Score_Board[i][j];
            }
            DFS(PN - 1, Day + 1);
            if (Flag == true) return;
 
            for (int j = 0; j < N; j++)
            {
                if (Player[j].LIVE == false) continue;
                Player[j].Score = Player[j].Score - Score_Board[i][j];
            }
            Player[i].LIVE = true;
        }
    }
    else
    {
        int Max_Score = 0;
        int Idx = 0;
        for (int i = 0; i < N; i++)
        {
            if (Player[i].LIVE == false) continue;
            
            if (Player[i].Score > Max_Score)
            {
                Max_Score = Player[i].Score;
                Idx = i;
            }
            else if (Player[i].Score == Max_Score) Idx = Min(Idx, i);
        }
 
        Player[Idx].LIVE = false;
        DFS(PN - 1, Day);
        if (Flag == true) return;
        Player[Idx].LIVE = true;
    }
}
 
void Solution()
{
    DFS(N, 0);
    cout << Answer << endl;
}
 
void Solve()
{
    Input();
    Solution();
}
 
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    //freopen("Input.txt", "r", stdin);
    Solve();
 
    return 0;
}

0개의 댓글