Example #1
0
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;
}
Example #2
0
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;
}
Example #3
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;
}
Example #4
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;
}