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;
}

  • 方法二:
posted @ 2023-03-20 10:52  TFLSNOI  阅读(107)  评论(0编辑  收藏  举报