Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
if idx in [2,9,14,15,16,17,18,21,22,23,24,25,28,29,30,31,32,37,44]:
#include<stdio.h>
#include<memory.h>
#include<time.h>
int *Arr; // 2^30 bytes, 2^28 ints
int L=1<<28;
long long Sit0=0x1fffeffffLL;
int fld[49]={-1,-1,0,1,2,-1,-1, -1,-1,3,4,5,-1,-1, 6,7,8,9,10,11,12, 13,14,15,16,17,18,19, 20,21,22,23,24,25,26, -1,-1,27,28,29,-1,-1, -1,-1,30,31,32,-1,-1};
int nsteps=0;
long long Steps[80][2];
void AddStep(int a,int b,int c){
if(a<0 || b<0 || c<0) return;
Steps[nsteps][0]=(1LL<<a)+(1LL<<b);
Steps[nsteps][1]=(1LL<<c);
Steps[nsteps+1][0]=(1LL<<c)+(1LL<<b);
Steps[nsteps+1][1]=(1LL<<a);
nsteps+=2;
}
void InitSteps(){
for(int i=0;i<49;i++){
if((i%7)<5) AddStep(fld[i],fld[i+1],fld[i+2]);
if(i<35) AddStep(fld[i],fld[i+7],fld[i+14]);
}
}
int Solution[33];
int LS=0;
bool Solve(long long s){
Arr[(int)(s>>5)]|=1<<((int)s&31);
if((s&(s-1))==0) return true;
for(int k=0;k<nsteps;k++){
long long u=Steps[k][0],v=Steps[k][1];
if((u&~s)==0 && (v&s)==0){
long long s1=(s&~u)|v;
if((Arr[(int)(s1>>5)]&1<<((int)s1&31))==0){
if(Solve(s1)){
Solution[LS++]=k;
return true;
}
}
}
}
return false;
}
void main(){
long c=clock();
InitSteps();
Arr=new int[L];
memset(Arr,0,L*4);
if(Solve(Sit0)){
for(int m=LS;--m>=0;){
int k=Solution[m];
long long u=Steps[k][0],v=Steps[k][1];
for(int i=0;i<33;i++) if(u&1LL<<i) printf("%d ",i);
for(int i=0;i<33;i++) if(v&1LL<<i) printf("-> %d\n",i);
}
}
printf("Time=%ld\n",clock()-c);
}
vector<bool> и за 1.7 сек и несколько MB с использованием std::unordered_set.
Применяем на практике знания, полученные на курсе MIT 6.00x (edx.org)