회원가입
로그인
Toggle navigation
문제
문제
전체 문제
문제 출처
단계별로 풀어보기
알고리즘 분류
추가된 문제
문제 순위
문제
푼 사람이 한 명인 문제
아무도 못 푼 문제
최근 제출된 문제
최근 풀린 문제
랜덤
출처
ICPC
Olympiad
한국정보올림피아드
한국정보올림피아드시․도지역본선
전국 대학생 프로그래밍 대회 동아리 연합
대학교 대회
카카오 코드 페스티벌
Coder's High
ICPC
Regionals
World Finals
Korea Regional
Africa and the Middle East Regionals
Europe Regionals
Latin America Regionals
North America Regionals
South Pacific Regionals
문제집
대회
1
채점 현황
랭킹
게시판
그룹
더 보기
재채점 기록
블로그
강의
실험실
도움말
BOJ Stack
BOJ Book
16986번 - 인싸들의 가위바위보
BaaaaaaaaaaarkingDog
C++14
#include <bits/stdc++.h> using namespace std; int n,k; int a[11][11]; int p[2][25]; // 경희/민호의 패턴 bool isused[11]; // 지우가 각 손동작을 사용했는가 void solve(int ch, int op, int* ww, int* idxx){ // ch(choice) : 지우가 선택한 손동작, op(opponent) : 지우와 붙을 상대가 누구인지.(0 or 1) int idx[2] = {idxx[0],idxx[1]}; int w[3] = {ww[0],ww[1],ww[2]}; int op_ch = p[op][idx[op]++]; // 상대가 선택한 손동작 int new_op = -1; // 지우의 입장에서, op와 대결을 한 이후 그 다음에 지우가 대결해야 할 상태가 누구인가.(다음 재귀함수를 따라들어가기 위해 필요) if(a[ch][op_ch] == 2){ // 지우가 승리했을 경우 w[2]++; if(w[2] == k){ cout << 1; exit(0); // k번 승리하는 경우를 찾았으므로 1 출력 후 프로그램 바로 종료 } new_op = 1-op; } else{ // 상대가 승리했을 경우 w[op]++; if(w[op] == k) // 상대가 우승함 return; // 강제종료 // 이제 경희와 민호가 붙음 int ch0 = p[0][idx[0]++]; int ch1 = p[1][idx[1]++]; if(a[ch0][ch1] == 2){ // 경희 승 w[0]++; if(w[0] >= k) return; new_op = 0; } else{ // 민호 승 w[1]++; if(w[1] >= k) return; new_op = 1; } } // 이제 지우가 new_op와 다음 대결을 해야 함. for(int i = 1; i <= n; i++){ if(isused[i]) continue; // 이미 i를 사용했으면 넘어감 // 지우는 다음 대결에서 i를 낼 것이다. isused[i] = true; solve(i, new_op, w, idx); isused[i] = false; // 들어갔다 나온 이후에는 변수를 되돌려야 함. } // 모든 경우를 다 따져봤으나 실패했을 경우 } int main(void){ ios::sync_with_stdio(0); cin.tie(0); cin >> n >> k; for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ cin >> a[i][j]; } } for(int i = 0; i < 20; i++) cin >> p[0][i]; for(int i = 0; i < 20; i++) cin >> p[1][i]; for(int i = 1; i <= n; i++){ isused[i] = true; int w[3] = {0,0,0}; // 각 플레이어가 이긴 횟수(경희는 0번, 민호는 1번, 지우는 2번) int idx[2] = {0,0}; // 경희/민호가 내야하는 손동작(경희는 0번, 민호는 1번) solve(i, 0, w, idx); // 경희와 대결을 시작하자. i를 낼 것이다. isused[i] = false; } // 만약 이기는 경우가 하나라도 있으면 1이 출력하고 종료되기에 여기에 도달하지 못한다. cout << 0; }
결과
메모리
시간
코드 길이
맞았습니다!!
1988
12
2573