Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- hxGroesseXyGroesse,xPosition,yPosition
- für ein zu definierendes Hindernis
- *xMindestgroeseXYMindestgroesse
- direkt hintendran fuer einen durchzuprobierenden Block,
- der noch in den Bereich mit dem Hindernis paßt.
- Die festen Bloecke definiert man lieber zuerst.
- Danach direkt Semikolon und fertig.
- Es sollen aus einem anderen Ding Formen rausgeschnitten werden
- und anschließend versucht das Programm mit Backtracking, die
- Form so einzufügen, damit möglichst wenig Einzelteile gebraucht
- werden und es den Restbereich möglichst gut abdeckt.
- Nachdem man die rausgeschnittenen Formen definiert hat,
- kann man immer noch danach auch mit Backtracking andere Positionen
- zum Herausschneiden suchen und spart möglichst viel von dem
- laufenden Material.
- Sowas in der Art soll es werden.
- */
- #include <stdio.h>
- #include <fcntl.h>
- #include <stdlib.h>
- #define XSIZE 10
- #define YSIZE 10
- int charseqc,
- charseqlen=0;
- unsigned char command[2048];
- int nquickest=0;
- unsigned char sequencefeed[2048];
- unsigned char input[2048];
- unsigned int feedx, feedy, feedj,feedk;
- unsigned char screen[XSIZE][YSIZE];
- unsigned char backtrackfeed()
- {
- /*if ( charseqc!=simbreak)printf("%d %c",maskc, sequencefeed[charseqc]),getchar();
- else printf("q");*/
- if ( feedx > 0){ feedx--; return 'x'; }
- if ( feedy > 0){ feedy--; return 'y'; }
- if ( feedj > 0){ feedj--; return 'j'; }
- if ( feedk > 0){ feedk--; return 'k'; }
- unsigned char c=sequencefeed[charseqc];
- charseqc++;
- return c;
- }
- int remains=1000;
- int remainlen(int size)
- {
- if ( remains-size>0) return 1;
- else return 0;
- }
- void remainsub(int size)
- {
- remains-=size;
- }
- struct
- {
- int x,y,xdim,ydim;
- }boxes[100],boxbak[100];
- unsigned char htmltext[200*100];
- unsigned char cutarray[XSIZE][YSIZE],cutarraybak[XSIZE][YSIZE];
- int roomcovered=0,bestoldeval=0;
- int cutout(int n)
- {
- int x=0,y=0;
- int failed=0;
- failed=0;
- int x_start=0,y_start=0;
- int x_iter,y_iter;
- y_start=0;
- while ( y_start+boxes[n].ydim<YSIZE)
- {
- x_start=0;
- while ( x_start+boxes[n].xdim<XSIZE)
- {
- failed=0;
- y_iter=0;
- while ( y_iter <boxes[n].ydim)
- {
- x_iter=0;
- while ( x_iter < boxes[n].xdim)
- {
- if (cutarray[x_start+x_iter][y_start+y_iter]!=0) failed=1;
- if ( failed==0&& x_iter==boxes[n].xdim-1&&y_iter==boxes[n].ydim-1) goto matched;
- x_iter++;
- }
- y_iter++;
- }
- x_start++;
- }
- y_start++;
- }
- return 1;
- matched:
- y_iter=0;
- while ( y_iter<boxes[n].ydim)
- {
- x_iter=0;
- while ( x_iter<boxes[n].xdim)
- {
- cutarray[x_start+x_iter][y_start+y_iter]=n+1,roomcovered++;
- x_iter++;
- }
- y_iter++;
- }
- return 0;
- }
- void cutreset(int n)
- {
- int x=0,y=0;
- y=0;
- if ( n==-2)
- {
- y=0;
- while ( y< YSIZE)
- {
- x=0;
- while ( x < XSIZE)
- {
- cutarraybak[x][y]=cutarray[x][y];
- x++;
- }
- printf("\n");
- y++;
- }
- return 0;
- }
- if ( n==-1)
- {
- printf("\n-----\nSo schneiden:\n");
- y=0;
- while ( y< YSIZE)
- {
- x=0;
- while ( x < XSIZE)
- {
- printf("%c",cutarraybak[x][y]==0? 177 :cutarraybak[x][y]+0x31);
- x++;
- }
- printf("\n");
- y++;
- }
- return 0;
- }
- while ( y< YSIZE)
- {
- x=0;
- while ( x < XSIZE)
- {
- if ( cutarray[x][y]==n+1||n==0)
- {
- cutarray[x][y]=0;
- if ( n!=0)roomcovered--;
- }
- x++;
- }
- y++;
- }
- }
- int generate(int n)
- {
- unsigned char generatestring[200];
- //if ( boxes[n].xdim==0||boxes[n].ydim==0) return 0;
- unsigned char x[5],y[5];
- int n2=0,n3=0;
- //printf("Text(T) oder Bild(B)");
- unsigned char test;
- switch((test=toupper(backtrackfeed())))
- {
- case 'T':
- if ( cutout(n)==0)
- {
- //printf("%d %d %d %d\n",boxes[n].x,boxes[n].y,boxes[n].xdim,boxes[n].ydim),getch();
- return 1;
- }
- return 0;
- case 'B': cutout(n);
- return 1;
- default: return 0;
- }
- }
- signed int boxptr=0;
- int backtracksteps(int rec_depth, int cmdpos)
- {
- int allteststeps=1;
- charseqc=0;
- //if ( rec_depth>5) return 0;
- if ( command[cmdpos]==';')
- {
- charseqc=0;
- /*sequencefeed[0]='d',*/sequencefeed[1]='q';
- teststep();
- /*
- sequencefeed[0]='r',
- charseqc=0;
- teststep();
- */
- }
- else
- if ( command[cmdpos]=='h')
- {
- sequencefeed[0]='n',sequencefeed[1]='b';
- charseqc=0;
- feedk=0,feedx=0,feedy=0;
- feedj=command[cmdpos+4];
- while ( feedj > 0)teststep();
- feedj=0,feedx=0,feedy=0;
- feedk=command[cmdpos+3];
- while ( feedk > 0)teststep();
- feedy=0,feedj=0,feedk=0;
- feedx=command[cmdpos+1];
- while ( feedx>0 )teststep();
- /*
- printf("TEST%d",feedx),getch();
- unsigned char teststring[100];
- scanf("%s",teststring);
- */
- feedx=0,feedj=0,feedk=0;
- feedy=command[cmdpos+2];
- while ( feedy>0)teststep();
- if (teststep()==0)
- printf("Hindernis eingefuegt...");
- //printf("gehe rein..."),getchar();
- backtracksteps(rec_depth+1,cmdpos+5);
- }
- else if (command[cmdpos]=='*')
- {
- //printf("binda"),getch();
- int xbuf2,ybuf2,kbuf2,jbuf2;
- jbuf2=0;
- while ( jbuf2 < YSIZE)
- {
- kbuf2=0;
- while ( kbuf2 < XSIZE)
- {
- xbuf2=XSIZE/2;
- if(xbuf2+command[cmdpos+1]+kbuf2>=XSIZE) xbuf2=0;
- while ( xbuf2>0)
- {
- ybuf2=YSIZE/2;
- if(ybuf2+command[cmdpos+2]+jbuf2>=YSIZE) ybuf2=0;
- while ( ybuf2>0)
- {
- boxes[boxptr].x=kbuf2,boxes[boxptr].y=jbuf2,
- boxes[boxptr].xdim=command[cmdpos+1]+xbuf2,boxes[boxptr].ydim=command[cmdpos+2]+ybuf2;
- feedx=0,feedy=0,feedk=0,feedj=0;
- charseqc=0;
- sequencefeed[0]='c';
- if ( teststep()==0)
- {
- //printf("Probe..."),getch();
- charseqc=0;
- sequencefeed[0]='n',sequencefeed[1]='t';
- if (teststep()==0 )
- {
- //printf("Kam tiefer..."),getch();
- charseqc=0;
- sequencefeed[0]='q';
- teststep();
- //printf("%d",boxptr),getch();
- backtracksteps(rec_depth+1,cmdpos+5) ;
- sequencefeed[0]='r',
- charseqc=0;
- teststep();
- }
- }
- ybuf2--;
- }
- xbuf2--;
- }
- kbuf2++;
- }
- jbuf2++;
- }
- return 1;
- }
- return allteststeps;
- }
- int draw=0;
- int main(void)
- {
- printf("Hindernis oder * fuer Positionierungserproben,(Mindest-)BreiteXLaenge,Start,Ende; :\n");
- gets(input);
- int n=0,n2=0,n3=0;
- int number;
- n=0;
- while ( input[n]!='\0')
- {
- if ( input[n]=='*'||input[n]=='h') command[n3]=input[n],n3++,n++; else return;
- n2=0,number=0;while ( input[n2+n]>=0x30&&input[n2+n]<=0x39)number*=10,number+=input[n2+n]-0x30,n2++;
- command[n3]=number,n3++,n+=n2;
- if ( input[n]=='X')n++; else return;
- n2=0,number=0;while ( input[n2+n]>=0x30&&input[n2+n]<=0x39)number*=10,number+=input[n2+n]-0x30,n2++;
- command[n3]=number,n3++,n+=n2;
- if ( input[n]==',')n++; else return;
- n2=0,number=0;while ( input[n2+n]>=0x30&&input[n2+n]<=0x39)number*=10,number+=input[n2+n]-0x30,n2++;
- command[n3]=number,n3++,n+=n2;
- if ( input[n]==',')n++; else return;
- n2=0,number=0;while ( input[n2+n]>=0x30&&input[n2+n]<=0x39)number*=10,number+=input[n2+n]-0x30,n2++;
- command[n3]=number,n3++,n+=n2;
- if ( input[n]==';') command[n3]=';',n3++,n++; else if ( input[n]=='*'||input[n]=='h');else return;
- if ( input[n]=='\0') break;
- }
- command[n3]='\0';
- cutreset(0);
- printf("binda");
- sequencefeed[0]='i',teststep();
- int succeeded;
- charseqc=0;
- feedx=0,feedy=0,feedj=0,feedk=0;
- succeeded=backtracksteps(0,0);
- int x=0,y=0;
- memcpy(boxes,boxbak,sizeof(boxes));
- boxptr=nquickest;
- printf("%d",boxptr),getch();
- draw=1;
- charseqc=0,sequencefeed[0]='i';
- teststep();
- cutreset(-1);
- }
- int teststep(void)
- {
- int stepfailed=0;
- static
- enum
- {
- up,down,left,right,grewx,grewy,test
- }LASTSTEP;
- static
- unsigned char collide[XSIZE][YSIZE];
- int x,y;
- static int n=0;
- static int initbuffer=0;
- if ( initbuffer==0)
- {
- y=0;
- while ( y<YSIZE )
- {
- x=0;
- while ( x<XSIZE ) screen[x][y]=collide[x][y]=0,x++; y++;
- }
- boxes[n].x=boxes[n].y=boxes[n].xdim=boxes[n].ydim=0;
- }
- n=boxptr;
- unsigned char c;
- //while(1)
- {
- if ( 1)
- {
- switch(c=backtrackfeed())
- {
- case 'x': if ( boxes[boxptr].xdim<XSIZE/2&&boxes[boxptr].x+boxes[boxptr].xdim<XSIZE-1)
- boxes[boxptr].xdim++; LASTSTEP=grewx; break;
- case 'y':if ( boxes[boxptr].ydim<YSIZE/2&&boxes[boxptr].y+boxes[boxptr].ydim<YSIZE-1)
- boxes[boxptr].ydim++; LASTSTEP=grewy;break;
- case 's': if ( boxes[boxptr].xdim>0)
- boxes[boxptr].xdim--; break;
- case 'a': if ( boxes[boxptr].ydim>0)
- boxes[boxptr].ydim--; break;
- case 'u': if ( boxes[boxptr].y>0)
- boxes[boxptr].y--; LASTSTEP=up;break;
- case 'j': if ( boxes[boxptr].y+boxes[boxptr].ydim<YSIZE-1)
- boxes[boxptr].y++;LASTSTEP=down; break;
- case 'h': if ( boxes[boxptr].x>0)
- boxes[boxptr].x--; LASTSTEP=left;break;
- case 'k': if ( boxes[boxptr].x+boxes[boxptr].xdim<XSIZE-1)
- boxes[boxptr].x++; LASTSTEP=right;break;
- case 'n': if(generate(boxptr)==1) {
- boxptr++; boxes[boxptr].x=boxes[boxptr].y=boxes [boxptr].xdim=boxes[boxptr].ydim=0; return 0; }
- else return 1; // paßt nicht
- break;
- case 'r' : n--,boxptr--,cutreset(boxptr); return 0;
- case 'c' : LASTSTEP=test; break;
- case 'd' : memcpy(boxbak,boxes,sizeof(boxes)), nquickest=boxptr; break;
- case 'q': goto writeout;
- }
- }
- //if(initbuffer==0)
- {
- y=0;
- while ( y<YSIZE )
- {
- x=0;
- while ( x<XSIZE ) screen[x][y]=' ',collide[x][y]=255,x++;
- y++;
- }
- //screen[boxes[boxptr].x][boxes[boxptr].y]='X';
- initbuffer=1;
- }
- n=0;
- while ( n < boxptr+1)
- {
- if ( n==boxptr&&boxes[n].xdim==0&&boxes[n].ydim==0)break;
- int dimc_x,dimc_y;
- dimc_y=boxes[n].ydim;
- while ( dimc_y>=0)
- {
- dimc_x=boxes[n].xdim;
- while ( dimc_x >= 0 )
- {
- if ( collide[boxes[n].x+dimc_x][boxes[n].y+dimc_y]==255||collide[boxes[n].x+dimc_x][boxes[n].y+dimc_y]==n)
- screen[boxes[n].x+dimc_x][boxes[n].y+dimc_y]=n+0x30,
- collide[boxes[n].x+dimc_x][boxes[n].y+dimc_y]=n;
- else
- {
- //printf("\a");
- stepfailed=1;
- int x2,y2;
- int xgoal,ygoal;
- ygoal=boxes[n].y+boxes[n].ydim;
- xgoal=boxes[n].x+boxes[n].xdim;
- y2=boxes[n].y;
- while ( y2<ygoal)
- {
- x2=boxes[n].x;
- while ( x2<xgoal)
- {
- if ( collide[x2][y2]==n)
- {
- collide[x2][y2]=255;
- screen[x2][y2]=' ';
- }
- x2++;
- }
- y2++;
- }
- switch(LASTSTEP)
- {
- case up: boxes[n].y++;break;
- case down:boxes[n].y--;break;
- case left:boxes[n].x++;break;
- case right:boxes[n].x--;break;
- case grewx: boxes[n].xdim--; break;
- case grewy: boxes[n].ydim--; break;
- case test: return 1;
- }
- dimc_x=0;
- dimc_y=boxes[n].ydim+1;
- goto repeat;
- }
- dimc_x--;
- }
- repeat:
- dimc_y--;
- }
- n++;
- }
- if ( rand()%1000==0||draw==1)
- {
- system("cls");
- y=0;
- while ( y < YSIZE)
- {
- x=0;
- while ( x<XSIZE) printf("%c%c%c%c%c",screen[x][y],screen[x+1][y],screen[x+2][y],screen[x+3][y],screen[x+4][y]),x+=5;
- printf("\n");
- y++;
- }
- }
- }
- //if ( c=='c' )boxptr--,n--;
- if (1) return stepfailed;
- writeout:
- (0);
- if ( stepfailed==0&&roomcovered/boxptr>= bestoldeval)
- {
- memcpy(boxbak,boxes,sizeof(boxes));
- cutreset(-2);
- //printf("Schreibe... boxptr ist %d roomcovered ist %d",boxptr,roomcovered),getch();
- nquickest=boxptr;
- bestoldeval=roomcovered/boxptr;
- //printf("%d %d",n,boxptr),getch();
- }
- return stepfailed;
- /*
- (0);
- FILE *output=fopen("posdata","wb");
- fwrite(boxes, sizeof(boxes),1,output);
- fwrite(htmltext, sizeof(htmltext),1,output);
- fwrite(&boxptr,sizeof(signed int),1,output);
- fclose(output);
- */
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement