P1088 [NOIP2004 普及组] 火星人
题目链接
https://www.luogu.com.cn/problem/P1088
题解
- 方法一:20分,暴力枚举,把所有情况列出,找到给出的手势,往后数m个即为答案
#include<bits/stdc++.h>
using namespace std;
const int maxN=10010;
int n, m, a[maxN], cnt;
bool vis[maxN];
string ans[maxN]; //用于存放火星人手指的排列顺序
string st;//火星人手指的排列顺序
void dfs(int dep){
if(dep==n+1){
cnt++;
for(int i=1; i<=n; i++)
ans[cnt].push_back(char(a[i]+48));
//cout<<cnt<<":"<<ans[cnt]<<endl;
}
for(int i=1; i<=n; i++){
if(!vis[i]){
a[dep]=i;
vis[i]=1;
dfs(dep+1);
vis[i]=0;
}
}
}
int main()
{
cin>>n>>m;
dfs(1);
for(int i=1; i<=n; i++){
string c;
cin>>c;
st+=c;
}
int sn;
for(int i=1; i<=cnt; i++)
if(ans[i]==st){
sn=i;
break;
}
for(int i=0; i<n; i++)
cout<<ans[sn+m][i]<<" ";
return 0;
}
- 方法二: