void MLX(int now, int dist, int nleft) { int i,nbrevsav,leftsav; if(dist+d[now][0]>=mini) return; //Kan aldrig bli en bästa lösning //Spara tillståndet: nbrevsav=nbrev[now]; leftsav=left[now]; //Hämta paketen som ska skickas från now: for(i=0;i<nbrev[now];i++) left[brev[now][i]]--; nbrev[now]=0; //Lämna paketen som ska till now: if(left[now]==0) { left[now]=-1; nleft--; } if(nleft==0) { //Om det var sista lämningen så är vi färdiga och har hittat den hittills bästa lösningen... mini=dist+d[now][0]; // ... men vi måste tillbaka till 0 också. } else { //Annars fortsätter vi for(i=1;i<N;i++) if(nbrev[i]>0 || left[i]==0) { //Välj en stad som vi antingen ska lämna eller hämta paket i MLX(i,dist+d[now][i],nleft); //Rekursera! } } //Vi backtrackar. Återställ tillståndet: nbrev[now]=nbrevsav; for(i=0;i<nbrev[now];i++) left[brev[now][i]]++; left[now]=leftsav; }
int main(){ int i,j,nb,from,to,tot; FILE* f; // create a new file pointer ((f=fopen("budbil.dat","r"))); fscanf(f,"%d %d", &N, &nb); for(i=0;i<N;i++) { for(j=0;j<N;j++) fscanf(f,"%d", &d[i][j]); nbrev[i]=0; //Antal paket som ska hämtas i staden left[i]=-1; //Antal paket som ska till staden och ännu inte är upphämtade (eller -1 om redan levererat) } tot=0; //Antal städer dit det ska levereras paket for(i=0;i<nb;i++) { fscanf(f,"%d %d", &from, &to); from--; to--; brev[from][nbrev[from]++]=to; if(left[to]==-1) { left[to]=1; if(to!=0) tot++; } else left[to]++; } mini=1000000000; MLX(0,0,tot); printf("Minsta körsträcka: %d\n",mini); return 0; }
int main() { int r,c; char buf[101]; //Interface reading input in 1D format scanf("%d %s", &N, buf); R=strlen(buf); C=1; for(r=0;r<R;r++) org[r][0]=buf[R-1-r]; //General program for(r=0;r<R;r++) for(c=0;c<C;c++) s[0][r][c]=org[r][c]; ma=0; mnm=0; tot=0; for(c=0;c<C;c++) pos[0][c]=0; MLX(0,0); printf("%d\n", ma); return 0; }
void MLX(int nr, int score) { int r,c,i,n, found,nm; char tmp; tot++; if(nr>0) { //Copy current state for(c=0;c<C;c++) { for(r=0;r<R;r++) s[nr][r][c]=s[nr-1][r][c]; pos[nr][c]=pos[nr-1][c]; } } //Crush while(1) { for(r=0;r<R;r++) for(c=0;c<C;c++) flag[r][c]=0; found=0; for(r=0;r<R;r++) { n=1; for(c=1;c<=C;c++) { if(c<C && s[nr][r][c]==s[nr][r][c-1]) n++; else { if(n>=3) { for(i=c-1;i>=c-n;i--) flag[r][i]=1; score+=SCORE(n); found=1; } n=1; } } } for(c=0;c<C;c++) { n=1; for(r=1;r<=R;r++) { if(r<R && s[nr][r][c]==s[nr][r-1][c]) n++; else { if(n>=3) { for(i=r-1;i>=r-n;i--) flag[i][c]=1; score+=SCORE(n); found=1; } n=1; } } } if(!found) break; for(c=0;c<C;c++) { i=0; for(r=R-1;r>=0;r--) if(!flag[r][c]) t[i++]=s[nr][r][c]; while(i<R) { t[i++]=org[R-1-pos[nr][c]][c]; pos[nr][c]=(pos[nr][c]+1)%R; } for(i=0;i<R;i++) s[nr][i][c]=t[R-1-i]; } } if(score>ma) ma=score; //for(i=0;i<nr;i++) printf(" "); printf("%d\n", score); //Graphical description of recursive tree with points if(nr==N) return; nm=0; for(r=0;r<R;r++) for(c=0;c<C-1;c++) if(s[nr][r][c]!=s[nr][r][c+1]) { tmp=s[nr][r][c]; s[nr][r][c]=s[nr][r][c+1]; s[nr][r][c+1]=tmp; if(match(nr,r,c)||match(nr,r,c+1)) { nm++; MLX(nr+1,score); } tmp=s[nr][r][c]; s[nr][r][c]=s[nr][r][c+1]; s[nr][r][c+1]=tmp; } for(r=0;r<R-1;r++) for(c=0;c<C;c++) if(s[nr][r][c]!=s[nr][r+1][c]) { tmp=s[nr][r][c]; s[nr][r][c]=s[nr][r+1][c]; s[nr][r+1][c]=tmp; if(match(nr,r,c)||match(nr,r+1,c)) { nm++; MLX(nr+1,score); } tmp=s[nr][r][c]; s[nr][r][c]=s[nr][r+1][c]; s[nr][r+1][c]=tmp; } if(nm>mnm) mnm=nm; }