staticvoidbacktrk(intcnt){if(cnt==M){// 원하는 결과 만들기return;}for(inti=cnt;i<N;i++){if(!visited[i]){// 방문한다.(예시 0번째 idx 방문)visited[i]=true;// 0 번째 idx 를 방문했으니 이제 cnt +1 하고 다른거 방문해보러 출발!backtrk(cnt+1);// 방문을 하지 않고, 다른걸 방문한다.visited[i]=false;}}}
해결 코드
해결 코드는 아래와 같다. 여기서는 중복을 포함 해야했기 때문에 for문을 계속 적으로 0번째에서 부터 쭉 돌린다.
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespacepgm_dev{classProgram{staticbool[]visited;staticint[]result;staticintM,N;staticStringBuilderstringBuilder=newStringBuilder();staticvoidbacktrk(intcnt){if(cnt==M){for(inti=0;i<M;i++){stringBuilder.Append(result[i]+1+" ");}stringBuilder.Append("\n");return;}for(inti=0;i<N;i++){if(!visited[i]){visited[i]=true;result[cnt]=i;backtrk(cnt+1);visited[i]=false;}}}// 이부분은 쓰지 않았다.staticvoidprint(){for(inti=0;i<M;i++){Actionprint_line=()=>{if(M-1==i)Console.WriteLine(result[i]+1);elseConsole.Write($"{result[i]+1} ");};print_line();}}staticvoidMain(string[]args){string[]input=Console.ReadLine().Split();N=int.Parse(input[0]);M=int.Parse(input[1]);visited=newbool[N];result=newint[M];for(inti=0;i<N;i++){visited[i]=false;}backtrk(0);Console.Write(stringBuilder.ToString());}}}