//全排列1~n
#include<iostream>
using namespace std;
const int N=1e4;
static int m=1;
int n;
int a[N];
int ans[N][N];
int visit[N];
void dfs(int dep){
if(dep==n+1) {
for(int i=1;i<=n;++i){
ans[m][i]=a[i];
}
m++;
return;
}
for(int i=1;i<=n;++i){
if(visit[i]) continue;
a[dep]=i;
visit[i]=1;
dfs(dep+1);
visit[i]=0;
}
}
int main(){
cin>>n;
dfs(1);
for(int i=1;i<=m-1;++i){
for(int j=1;j<=n;++j){
cout<<ans[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
//全排列1~n
#include<iostream>
using namespace std;
const int N=1e4;
static int m=1;
int n,k;
int a[N];
int ans[N][N];
int visit[N];
void dfs(int dep){
if(dep==n+1) {
for(int i=1;i<=n;++i){
ans[m][i]=a[i];
}
m++;
return;
}
for(int i=1;i<=k;++i){
a[dep]=i;
dfs(dep+1);
}
}
int main(){
//假定有n个位置,每一个位置都是1~k变化
cin>>n>>k;
dfs(1);
for(int i=1;i<=m-1;++i){
for(int j=1;j<=n;++j){
cout<<ans[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
比如输入4 2,结果就是4个位置,每一个位置1~2的变化。
例题:
#### 解题思路
我这里是这样想的,由于每一个位置都有可能是&,^,|但是我不太好循环字符,我就将其转换成为1,2,3(一一对应)。但是由于有10个位置,也就是一共有3^10。我本来想开一个a[N][N]的数组来存储,但是我当时遇见了这么个问题:
接下来,我需要结合用户之前的代码来分析。之前的代码中,他们定义了一个全局的二维数组`ans[N][N]`,其中N是1e5(100000)。这会占用非常大的内存空间,因为每个元素是int类型(4字节),所以总大小是100000 * 100000 * 4 = 40,000,000,000字节,也就是大约37GB。这显然远远超过了普通程序的栈或全局变量区的内存限制,导致编译或链接时无法分配如此大的内存,从而引发错误。
所以我就想每出来一个选择(即10个位置的一个组合),那就开始判断,是否满足,然后ans++;这里ans是静态变量,可以继承信息
```cpp
#include<iostream>
using namespace std;
int main(){
cout<<"30528";
return 0;
/*//全排列1~n
#include<iostream>
using namespace std;
const int N=1e6;
static int m=0;
int n,k;
int a[15];//1~10;
int arr[6][7];
static int ans=0;
int f(int a,int b,int op){
if(op==1) return a&b;
if(op==2) return a|b;
if(op==3) return a^b;
}
void dfs(int dep){
if(dep==n+1) {
for(int i=2;i<=5;++i){
for(int j=1;j<=6-i;++j){
int temp=4*(i-2)-(i-2)*(i-3)/2+j;
int op=a[temp];
arr[i][j]=f(arr[i-1][j],arr[i-1][j+1],op);
}
}
if(arr[5][1]==1) ans++;
return;
}
for(int i=1;i<=k;++i){
a[dep]=i;
dfs(dep+1);
}
}
int main(){
//假定有n个位置,每一个位置都是1~k变化
cin>>n>>k;
for(int i=1;i<=5;i++) cin>>arr[1][i];
dfs(1);
cout<<ans;
return 0;
}
*/
}
```