问题遇到的现象和发生背景
一个剪辑的模板由n个片段组成,我创建了n行素材,每行素材用a1到An,B1到Bn,C1到Cn命名,比如a1,2,3,4,5,如图所示
我想让每一个片段的画面都不同,第一行a行中,就只能出现B,C,D,E这几种,第二行B行依次类推,比如(A1.E2.D3.C4.B5)
我想要达到的结果
求n为9以内每一行不出现重复的规律,或者公式,以达到不重复混剪的功能,手动实在想不到,悬赏请求大家帮助
有点没搞懂,是这个意思吗?
#include<bits/stdc++.h>
using namespace std;
bool apr[101];
int nums[101]; // 动态元素存储
void print(int now,int deep,int M){
if(apr[now]) return; // 该元素出现过,跳出循环
apr[now] = true; // 该元素没出现过,标记出现
nums[deep] = now; // 该节点元素变为 now
for(int z=1;z<=M;z++) print(z,deep+1,M);
if(deep == M) {
for(int z=1;z<=deep;z++) printf("%d ",nums[z]);
putchar('\n');
}
apr[now] = false; // 该节点换元素了,标记该元素未出现
}
int main()
{
int N; // 素材总个数
cin >> N;
int M; // 每行素材数
cin >> M;
for(int z=1;z<=N;z++){
print(z,1,M); // 该组合第一个素材
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int N;
bool apr1[101],apr2[101];
vector<int> nums1,nums2;
vector<pair<vector<int>,vector<int>>> keys[101],result; // 单项结果存储
void print(int now,int num,int deep,int op){
if(apr1[now] || apr2[num]) return;
apr1[now] = true;
apr2[num] = true;
nums1.push_back(now);
nums2.push_back(num);
if(deep==N){
// 查看组合情况
// for(int z=0;z<N;z++){
// printf("%c%d ",'A'+nums1[z]-1,nums2[z]);
// }
// putchar('\n');
keys[op].emplace_back(nums1,nums2);
}
else for(int z=1;z<=N;z++){
for(int z1=1;z1<=N;z1++){
print(z,z1,deep+1,op);
}
}
nums1.pop_back();
nums2.pop_back();
apr1[now] = false;
apr2[num] = false;
}
void printResult(int now,int deep,pair<vector<int>,vector<int>>& line); // 结果输出
int main()
{
cin >> N;
for(int z=1;z<=N;z++){
print(z,1,1,z); // 该组合第一个素材
// printf("----------\n");
}
for(int z=1;z<=N;z++) {
for(int z1=0;z1<keys[z].size();z1++){
printResult(z,1,keys[z][z1]);
}
}
return 0;
}
bool apr3[101][101];
void printResult(int now,int deep,pair<vector<int>,vector<int>>& line){
if(apr1[now]) return;
apr1[now] = true;
for(int z=0;z<N;z++) apr3[line.first[z]][line.second[z]] = true;
result.push_back(line);
if(deep==N){
for(auto x:result){
for(int z=0;z<N;z++) printf("%c%d ",'A'+x.first[z]-1,x.second[z]);
putchar('\n');
}
printf("---------------\n");
}else{
for(int z=1;z<=N;z++){
if(apr1[z]) continue;
for(int z1=0;z1<keys[z].size();z1++){
bool flag = true;
for(int z2=0;z2<N;z2++){
if(apr3[keys[z][z1].first[z2]][keys[z][z1].second[z2]]){
flag = false;
break;
}
}
if(flag) printResult(z,deep+1,keys[z][z1]);
}
}
}
result.pop_back();
for(int z=0;z<N;z++) apr3[line.first[z]][line.second[z]] = false;
apr1[now] = false;
}
第一行不用动是吧
#include<bits/stdc++.h>
using namespace std;
vector<vector<int>> keys[101],op;
int N;
void DFS(int now,int deep,int head);
void print(int deep);
int main()
{
cin >> N;
for(int z=0;z<N;z++) DFS(z,1,z);
print(0);
return 0;
}
bool apr[101];
vector<int> key;
void DFS(int now,int deep,int head){
if(apr[now]) return;
apr[now] = true;
key.push_back(now);
if(deep==N){
keys[head].push_back(key);
}else{
for(int z=0;z<N;z++) DFS(z,deep+1,head);
}
key.pop_back();
apr[now] = false;
}
bool apr1[101][101];
void print(int deep){
if(deep==N){
for(const auto& x:op){
for( int z=0;z<x.size();z++) printf("%c%d ",65+x[z],z+1);
putchar('\n');
}
puts("-------------------");
}
else
{
for(auto & x : keys[deep]){
bool flag = false;
for(int z=0;z<N;z++) if(apr1[z][x[z]]){
flag = true;
break;
}
if(flag) continue;
for(int z=0;z<N;z++) apr1[z][x[z]] = true;
op.push_back(x);
print(deep+1);
op.pop_back();
for(int z=0;z<N;z++) apr1[z][x[z]] = false;
}
}
}