9 solutions

  • 3
    @ 2025-1-17 13:57:14
    #include <bits/stdc++.h>
    using namespace std;
    
    const int Kenton = 250;
    int n, r, a[Kenton];
    
    void dfs(int step)
    {
    	if (step > r)
    	{
    		for (int i = 1; i <= r; i++) cout << a[i] << " "; // 输出答案 
    		cout << endl; // 记得输出空行 
    		return;
    	}
    	for (int i = a[step - 1] + 1; i <= n; i++)
    	{
    		a[step] = i;
    		dfs(step + 1);
    	}
    }
    
    int main()
    {
    	cin >> n >> r; // 输入n,r 
    	dfs(1); // 进行深度优先搜索 
    	return 0;
    }
    
    /*
    好吧,其实这题真的很水。。。
    想不到有什么可以写的注释 
    可以当作dfs的第一题 
    */ 
    
    
    • 1
      @ 2024-3-6 16:32:32
      #include<iostream>
      using namespace std;
      int n,r;
      int a[114];//存储每数
      bool vis[514];//标记是否用过
      void dfs(int k)
      {
      	if(k>r)//足够长的时候
      	{
      		for(int i=1;i<=r;i++)//输出
      		{
      			cout<<a[i]<<" ";
      		}
      		cout<<endl;
      		return;//结束
      	}
      	for(int i=a[k-1]+1;i<=n;i++)//取下一个数
      	{
      		if(!vis[i])//没探索过时
      		{
      			a[k]=i;//记录这个数字
      			vis[i]=1;//标记
      			dfs(k+1);//递归
      			vis[i]=0;//回溯,恢复操作
      		}
      	}
      }
      int main()
      {
      	cin>>n>>r;//输入
      	dfs(1);//从头开始
      	return 0;//完结散花
      }
      
      • 0
        @ 2024-3-11 13:33:59

        题意

        nn 个数,求 rr 个数的全排列

        PS:排列要升序

        思路

        hhh,升序的全排列

        和正常的全排列一样,但到 rr 就可以输出了。而且由于是升序的,连检查数组都不用了

        代码

        #include <bits/stdc++.h>
        using namespace std;
        int n,r;
        int a[250];
        void dfs(int u){
        	if (u > r){
        		for (int i = 1;i <= r;i++){	// 这里到 r 就可以了
        			printf("%d ",a[i]);
        		}
        		cout << "\n";
        		return;
        	}
        	for (int i = a[u - 1] + 1;i <= n;i++){	// 从小到大排
        		a[u] = i;
        		dfs(u + 1);	// 这里不用判断,因为不会查到前面用的(升序)
        	}
        }
        int main(int argc, char **argv){
        	cin >> n >> r;
        	dfs(1);	// 索引从 1 开始,不然只能 30 WA
        	return 0;
        }
        
        • -2
          @ 2024-4-10 17:06:47

          简单的小题,===

          #include<bits/stdc++.h>
          using namespace std;
          int n,r,arr[31];
          bool check(int b,int a){
              if(b==0) return 0;
              for(int i=1;i<=a;i++){
                  if(arr[i]==b) return 0;
              }
              return 1;
          }
          void dfs(int a){
              if(a==r){
                  for(int i=1;i<=r;i++) cout<<arr[i]<<' ';
                  cout<<'\n';
                  return;
              }
              for(int i=arr[a];i<=n;i++){
                  if(check(i,a)){
                      arr[a+1]=i;
                      dfs(a+1);
                      arr[a+1]=0;
                  }
              }
          }
          int main(){
              cin>>n>>r;
              dfs(0);
              return 0;
          }
          
        • -2
          @ 2024-1-26 10:11:25

          easy~

          #include <iostream>
          using namespace std;
          
          int n, r;
          int a[25];
          bool visited[25];
          void dfs(int k)
          {
          	if(k > r)
          	{
          		for(int i = 1; i <= r; i++)
          			cout << a[i] << " ";
          		cout << endl;
          		return;
          	}
          	for(int i = a[k-1] + 1; i <= n; i++)
          	{
          		if(!visited[i])
          		{
          			a[k] = i;
          			visited[i] = 1;
          			dfs(k + 1);
          			visited[i] = 0;
          		}
          	}
          }
          
          int main()
          {
          	cin >> n >> r;
          	dfs(1);
          	return 0;
          }
          
          • -3
            @ 2024-3-6 17:00:47

            题意

            CnrC_n^r的结果全部输出

            死路

            没有,根本不会。

            致谢

            曾腹肌老师的提醒:全排列。

            思路

            每一个都排列没有用过的数字。

            70分TLE歹马

            #include<iostream>
            using namespace std;
            int n,r;
            int a[21];
            bool b[21];
            int main(){
            	cin>>n>>r;
            	void dfs(int);
            	dfs(0);
            }
            void dfs(int k){
            	if(k==r){
            		for(int i=0;i<k-1;i++)//问题
            			if(a[i]>a[i+1])//所
            				return;//在
            		for(int i=0;i<k;i++)
            			cout<<a[i]<<" ";
            		cout<<"\n";
            	}
            	else{
            		for(int i=1;i<=n;i++)
            			if(!b[i]){
            				a[k]=i;
            				b[i]=true;
            				dfs(k+1);
            				b[i]=false;
            			}
            	}
            }
            

            问题

            每次输出还要确定大小顺序

            再谢

            看了潘伟明的题解的我

            大受启发

            解决

            对于每1步,从前往后数,就可以避免大小顺序问题。

            AC歹马

            #include<iostream>
            using namespace std;
            int n,r;
            int a[21];
            bool b[21];
            int main(){
            	cin>>n>>r;
            	void dfs(int);
            	dfs(0);
            }
            void dfs(int k){
            	if(k==r){
            		for(int i=0;i<k;i++)
            			cout<<a[i]<<" ";
            		cout<<"\n";
            	}
            	else{
            		for(int i=a[k-1/*注意这里*/]+1;i<=n;i++)
            			if(!b[i]){
            				a[k]=i;
            				b[i]=true;
            				dfs(k+1);
            				b[i]=false;
            			}
            	}
            }
            

            问题

            为什么AC了还是歹马呢?看歹马,/*注意这里*/处如果k=0,k-1就是-1,a[-1],你懂的~

            解决

            所以老师指使我,改成1式,就像潘伟明一样

            AC代码

            #include<iostream>
            using namespace std;
            int n,r;
            int a[21];//数列
            bool b[21];//标记
            int main(){
            	cin>>n>>r;
            	void dfs(int);
            	dfs(1);//从1开始,防止a[-1]
            }
            void dfs(int k){
            	if(k>r){//0开始用==,1开始用==r+1或者直接>也是可以的
            
            		for(int i=1;i<k;i++)
            			cout<<a[i]<<" ";
            		cout<<"\n";
            	}
            	else{
            		for(int i=a[k-1]+1;i<=n;i++)
            			if(!b[i]){//如果没被标记过
            				a[k]=i;
            				b[i]=true;
            				dfs(k+1);
            				b[i]=false;//取消标记
            			}
            	}
            }
            

            彩蛋

            这次没有提示,提示都在题解里立,喜。

            原来的TLE版本全是我自己想的+曾老师提了嘴全排列,却和潘伟明不谋而合。

            后来改代码发现,这个方法想要对,代码和潘伟明的区别就仅限于变量名和格式,悲

            所以事先声明,这都是我个人成果,不存在任何抄袭现象。

            • -3
              @ 2024-1-24 9:57:19

              老师的呆马+整活 👀️

              #include<bits/stdc++.h>
              
              #define Genshin int
              #define Impact main
              #define Start ()
              #define kaka cin
              #define hepingjingying cout
              #define wangluogongzhu bool
              
              using namespace std;
              
              Genshin r, a[25], n;
              wangluogongzhu visited[25];
              void dfsy(int k){
              	if(k > r){
              		for(Genshin i = 1; i <= r; i++){
              			hepingjingying << a[i] << " ";
              		}
              		hepingjingying << endl;
              		return ;
              	}
              	for(Genshin i = a[k-1] + 1; i <= n; i++){
              		if(!visited[i]){
              			a[k] = i;
              			visited[i] = 1;
              			dfsy(k + 1);
              			visited[i] = 0;
              		}
              	}
              }
              
              Genshin Impact Start{
              	kaka >> n >> r;
              	dfsy(1);
              	return 0;
              }
              
              • -3
                @ 2024-1-24 9:48:42
                #include<bits/stdc++.h>
                using namespace std;
                int n,r;
                int a[25];
                bool vst[25]={};
                void A(int s){
                	if(s>r){
                		for(int i=1;i<=r;i++) cout<<a[i]<<" ";
                		cout<<"\n";
                		return;
                	}
                	for(int i=a[s-1]+1;i<=n;i++){
                		if(!vst[i]){
                			a[s]=i;
                			vst[s]=true;
                			A(s+1);
                			vst[s]=false;
                		}
                	}
                }
                int main(){
                	cin>>n>>r;
                	A(1);
                	return 0;
                }
                

                晚了一分钟

              • -4
                @ 2024-1-24 9:47:36

                AC呆马:

                #include <iostream>
                using namespace std;
                
                int n, r;
                int a[25];
                bool visited[25];
                void dfs(int k)
                {
                	if(k > r)
                	{
                		for(int i = 1; i <= r; i++)
                			cout << a[i] << " ";
                		cout << endl;
                		return;
                	}
                	for(int i = a[k-1] + 1; i <= n; i++)
                	{
                		if(!visited[i])
                		{
                			a[k] = i;
                			visited[i] = 1;
                			dfs(k + 1);
                			visited[i] = 0;
                		}
                	}
                }
                
                int main()
                {
                	cin >> n >> r;
                	dfs(1);
                	return 0;
                }
                
                • 1

                Information

                ID
                802
                Time
                1000ms
                Memory
                256MiB
                Difficulty
                5
                Tags
                # Submissions
                132
                Accepted
                52
                Uploaded By