学习全排列笔记

输出一二三的全排列

1.可以用暴力枚举(真的有点暴力)

从一开始往后枚举,如果已经又该元素那么便跳过它,废话不说来代码。

#include<iostream>
using namespace std;

void p1()
{
  for(int i=1;i<=3;i++)
    for(int j=1;j<=3;j++)
      for(int z=1;z<=3;z++)
      {
        if(i==j||j==z||i==z) continue;
        cout<<i<<j<<z<<endl;
      }
}

int main()
{
  p1();
  return 0;
}

静静地观察我们发现有一些浪费,有一些根本不合逻辑的可以直接在第二步否掉,比如说如果i==j那么就不用做第三部循环了,所以改善一下。

2.剪枝枚举

将不符合逻辑的剪掉

#include<iostream>
using namespace std;
void p2()
{
  for(int i = 1;i<=3;i++)
  {
    for(int j=1;j<=3;j++)
    {
      if(i==j) continue;
      for(int z = 1;z<=3;z++)
      {
        if(z==j||z==i) continue;
        cout<<i<<j<<z<<endl;
      }
    }
  }
}
int main()
{
  p2();
  return 0;
}

3.还可以用桶数组标记

#include<iostream>
using namespace std;
int lalala[200];
void p3()
{
  for(int i = 1;i<=3;i++)
  {
    lalala[i] = 1;
    for(int j=1;j<=3;j++)
    {
      if(lalala[j]) continue;
      lalala[j] = 1;
      for(int z = 1;z<=3;z++)
      {
        if(lalala[z]) continue;
        cout<<i<<j<<z<<endl;
      }
      lalala[j] = 0;
    }
    lalala[i] = 0;
  }
}

int main()
{
  p3();
  return 0;
}

刚刚学习,有些鄙陋,敬请见谅

未完待续.....

  

猜你喜欢

转载自www.cnblogs.com/yeah123/p/10702536.html
今日推荐