《Push Button I》题目分析
本题的数据范围只有N <= 8,又要求输出所有的解。比较容易想到就是穷举/暴搜。
不过我们仍应该先估计一下解的数量的上界。考虑每种表示法都是一个1~N的排列中插入若干个减号,所以解的数量不超过N! * 2^(N-1)。当N=8时大约是5000000,完全可以承受。
具体DFS的方法有很多种。其中一种做法是每次决策(1)选一个比当前组最后一个数更大的数加入当前组(避免组内123和321重复),(2)新建一个组。
本题的数据范围只有N <= 8,又要求输出所有的解。比较容易想到就是穷举/暴搜。
不过我们仍应该先估计一下解的数量的上界。考虑每种表示法都是一个1~N的排列中插入若干个减号,所以解的数量不超过N! * 2^(N-1)。当N=8时大约是5000000,完全可以承受。
具体DFS的方法有很多种。其中一种做法是每次决策(1)选一个比当前组最后一个数更大的数加入当前组(避免组内123和321重复),(2)新建一个组。
请问下如何解决这段代码的超时问题?(..
#include <set>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=10;
bool vis[N];
set <string> ans;
void dfs(int u,int n,int cnt,string s){
if(cnt==n){
ans.insert(s);
return ;
}
for(int i=1;i<=n;i++){
if(vis[i]) continue;
char c=i+'0';
vis[i]=true;
if(i>u) dfs(i,n,cnt+1,(s+c));
vis[i]=false;
if(s[s.size()-1]!='-'){
dfs(-1,n,cnt,(s+"-"));
}
}
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
vis[i]=true;
char c=(i+'0');
string s="";
dfs(i,n,1,s+c);
vis[i]=false;
}
cout<<ans.size()<<endl;
set <string> ::iterator it;
for(it=ans.begin();it!=ans.end();it++)
cout<<*it<<endl;
return 0;
}
好的,谢谢
set太耗时呢 ,最后一组数据过不去。修改一下搜索姿势,不需要去重,排序。