排列数-代码详解
#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; } 详细
希望与孩子们一起成长,见证