[BOJ] 3980. 선발 명단- 백트래킹,DFS c++

ha·2022년 1월 26일
0

BOJ

목록 보기
10/28

https://www.acmicpc.net/problem/3980

C++풀이(백트래킹 + dfs)

1.모든 경우의 수 dfs로 확인
2.dfs(int cnt=포지션 위치, int sum=현재 능력치 합)
3.cnt==11 함수 탈출 조건 / i(포지션)=0~11 순서대로 탐색
4.dfs 재귀 종료 후 다음 i 탐색 위해 visited초기화

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int tc;
int board[11][11];
int visited[11];
int ans;

void dfs(int cnt,int sum)
{
    if(cnt==11)
    {
        ans=max(sum,ans);
        return;
    }
    for(int i=0;i<11;i++)
    {
        if(board[cnt][i]==0) continue;
        if(visited[i]==0)
        {
            visited[i]=1;
            dfs(cnt+1,sum+board[cnt][i]);
            visited[i]=0;
        }
    }
}

int main() {
    ios_base::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
    cin >> tc;
    while(tc--)
    {
        for(int i=0;i<11;i++)
        {
            for(int j=0;j<11;j++)
            {
                cin>>board[i][j];
            }
        }
        memset(visited,0,sizeof(visited));
        ans=0;
        dfs(0,0);
        cout<<ans<<'\n';   
    }
}

0개의 댓글