陪伴孩子成长学习的地方 ------ 扫码添加微信

排列数-代码详解

#include <iostream>
#include <cstring>
using namespace std;
const int SIZE =25;
bool used[SIZE];
int data[SIZE]; int n,m,i,j,k;
bool flag;
int main() {
    cin>>n>>m;
    memset(used,false,sizeof(used)); 
 for(i=1;i<=m;i++){ // 求前m个数
        data[i]=i;//将前m个数放入data之中 
        used[i]=true; //使用了数字i,标记为true;  
      }
    flag=true;
    while(flag)  {
        for(i=1;i<=m-1;i++)
            cout<<data[i]<<" ";
        cout<<data[m]<<endl;
        flag=false; // 数字已经使用过了,不能再用
        for(i=m;i>=1;i--)  {
            used[data[i]]=false; /* 重新进行调整,从m位置倒序调整,将第i个位置对应的data[i]标记为未用*/
            for(j=data[i]+1;j<=n;j++) /*从读数data[i]的下一个数开始往下找*/
                if(!used[j])  { // 如果数组没有被使用
                    used[j]=true; //使用它
                    data[i]=j; //把数字j放到第i个位置上
                    flag=true;// 派到合格标记flag为true
                    break; //这一轮的for就不需要了,跳出循环
                }
            if(flag)    { // 如果flag为真
                for(k=i+1;k<=m;k++) // 从i+1到m开始
                    for(j=1;j<=n;j++) //从第 1 到第 n 个数
                        if(!used[j]) //如果第 j 个数没有使用过
                        {
                            data[k]=j; // j存入data
                            used[j]=true; // 标记j已经使用
                            break; //合适了跳出内层循环
                        }
                break; // 程序结束退出循环
            }
        }
    }
    return 0;
}
详细

 

posted @ 2019-08-09 19:02  极光编程小助手  阅读(368)  评论(0编辑  收藏  举报