diff --git a/.gitignore b/.gitignore deleted file mode 100644 index b9ace87549fb09524aab4b73f9c714246317d700..0000000000000000000000000000000000000000 --- a/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Ignore ctags -tags -tags.lock - -# Ignore binaries -.x_* -*.gch -*.out diff --git a/main b/main index 67aa4ccdaf209575a449595dc19fbd81593764bc..f2575dc283c9b9a9f662703d121d36e87cd618c4 100755 Binary files a/main and b/main differ diff --git a/main.dSYM/Contents/Resources/DWARF/main b/main.dSYM/Contents/Resources/DWARF/main index 2ce32e73f4be60b8e4cb499a93e09eeba7ab9fbb..6b46e0d1f86d7739777c7754adb13685ce867e9a 100644 Binary files a/main.dSYM/Contents/Resources/DWARF/main and b/main.dSYM/Contents/Resources/DWARF/main differ diff --git a/router/Makefile b/router/Makefile old mode 100755 new mode 100644 diff --git a/router/ap_int.h b/router/ap_int.h old mode 100755 new mode 100644 diff --git a/router/etc/ap_fixed_sim.h b/router/etc/ap_fixed_sim.h old mode 100755 new mode 100644 diff --git a/router/etc/ap_int_sim.h b/router/etc/ap_int_sim.h old mode 100755 new mode 100644 diff --git a/router/etc/ap_private.h b/router/etc/ap_private.h old mode 100755 new mode 100644 diff --git a/solver.c b/solver.c index ff9249311f9066f52559978677cf6b4b5ca4154f..e3b489335917804aa5d27fadc16f6c32001408e6 100644 --- a/solver.c +++ b/solver.c @@ -1,16 +1,17 @@ /* solver.c */ -/* Last Change: 2019/07/23 (Tue) 17:13:18. */ +/* Last Change: 2019/07/25 (Thu) 14:03:43. */ #include #include +#include +#include #include"solver.h" #include"io.h" -/* #include */ /* #include */ /* #include */ -/* #include */ -#define DEBUG 0 -#define abs(a) ((a) < 0 ? - (a) : (a)) +#define DEBUG 1 +#define ABS(a) ((a) < 0 ? - (a) : (a)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) /* short int connected[MAXLINE+1]={0}; //if line connected:2, if one end:1, otherwize:0 */ short int board_beta[MAXSIZE][MAXSIZE]; //big board data @@ -20,13 +21,30 @@ short int point[MAXBLOCK+1]; //XYZ //X: search priority, Y: number of edges in board, Z: number of edges in block short int first_block=1; short int costrank[1+MAXBLOCK*MAXBLOCK][2]; //ranking of cost: block being in (costrank[ranking][0],costrank[ranking][0]) +short int rdm[MAXBLOCK+1]; //random no +short int attempts=1; void print_board_beta(void){ short int i,j; + short int minw=MAXSIZE-1,maxw=0,minh=MAXSIZE-1,maxh=0; for(i=0;imaxw) + maxw=i; + if(imaxh) + maxh=j; + if(jj) - rank[i]++; + blocksrank[i]=1; } - if(DEBUG){ - for(i=1;i<=blocks;i++){ - printf("%d ",rank[i]); + for(i=1;i<=blocks;i++){ + for(j=1;j<=blocks;j++){ + if(point[rdm[i]]j) + blocksrank[rdm[i]]++; + /* else */ + /* printf("%d %d no\n",rdm[i],rdm[j]); */ } - printf("\n"); } + for(i=1;i<=blocks;i++) + rank[blocksrank[i]]=i; return; } void reset(void){ //excluding init_points short int i,j; - for(i=0;i0) //if edge exists - point[i]++; + point[i]+=2; + if(point[i]==0) + point[i]++; } update_ranks(); return; } -void add_point(short int blockid,short int lineid){ //use only once - short int i,j; +void add_point(short int blockid){ + short int i,j,k; for(i=1;i<=blocks;i++) - if(i!=blockid) + if(i!=blockid&&point[i]>0) for(j=1;j<=4;j++) - if(block_data[i][j][2]==lineid) //if edge exists - point[i]+=10; + for(k=1;k<=4;k++) + if(block_data[i][j][2]==block_data[blockid][k][2]&&block_data[blockid][k][2]>0) + point[i]+=10; + update_ranks(); + return; +} + +void sub_point(short int blockid){ + short int i,j,k; + for(i=1;i<=blocks;i++) + if(i!=blockid&&point[i]>0) + for(j=1;j<=4;j++) + for(k=1;k<=4;k++) + if(block_data[i][j][2]==block_data[blockid][k][2]&&block_data[blockid][k][2]>0) + point[i]+=10; + update_ranks(); return; } -/* short int random(short int id){ //edit this to randomly place blocks */ -/* return id; */ -/* } */ short int search_placable(short int blockid){ //calc the cost (sum of Euclidean distance of lines), returns the number of places short int cost[MAXSIZE][MAXSIZE][2]; //cost[x][y][0]:cost, cost[x][y][1]:rank @@ -116,7 +162,7 @@ short int search_placable(short int blockid){ //calc the cost (sum of Euclidean for(j=0;j0 && board_beta[i][j]==block_data[blockid][k][2]){ place[k][0]=i-block_data[blockid][k][0]; - place[k][1]=i-block_data[blockid][k][1]; + place[k][1]=j-block_data[blockid][k][1]; } } /* printf("%d, %d\n",place[k][0],place[k][1]); */ @@ -140,23 +186,19 @@ short int search_placable(short int blockid){ //calc the cost (sum of Euclidean cost[i][j][0]=-1; else{ cost[i][j][0]=0; - /* printf("%d, %d\n",abs(i-place[k][0]),abs(j-place[k][1])); */ - /* printf("%d\n",abs(i-place[k][0])+abs(j-place[k][1])); */ for(k=1;k<=4;k++){ if(place[k][0]!=SHRT_MIN) - cost[i][j][0]+=abs(i-place[k][0]); + cost[i][j][0]+=ABS(i-place[k][0]); if(place[k][1]!=SHRT_MIN) - cost[i][j][0]+=abs(j-place[k][1]); + cost[i][j][0]+=ABS(j-place[k][1]); } if(cost[i][j][0]==0) - cost[i][j][0]=abs(i-MAXSIZE/2)+abs(j-MAXSIZE/2); - /* cost[i][j][0]+=(short int)abs((int)(i-place[k][0]))+(short int)abs((int)(j-place[k][1])); */ + cost[i][j][0]=MAX(MAX(ABS(i-MAXSIZE/2),ABS(j-MAXSIZE/2)),MAX(ABS(i+blockw-MAXSIZE/2),ABS(j+blockh-MAXSIZE/2)));//*100+ABS(i-MAXSIZE/2)+ABS(j-MAXSIZE/2)+ABS(i+blockw-MAXSIZE/2)+ABS(j+blockh-MAXSIZE/2); cost[i][j][0]=10000-cost[i][j][0]; /* printf("%d\n",cost[i][j][0]); */ } } } - //ok /* calc costrank */ for(i=0;i0&&avail[nowy][nowx-1]>=2) + isbranch++; + if(nowy>0&&avail[nowy-1][nowx]>=2) + isbranch++; + if(nowx=2) + isbranch++; + if(nowy=2) + isbranch++; + if(isbranch>0){ + avail[nowy][nowx]=1; + return 0; + } + if(avail[nowy][nowx]==1) + avail[nowy][nowx]=2; + short int i,src=0; + short int searchorder[4]; //x+-,y+- + /* for(i=0;i<4;i++) */ + /* searchorder[i]=-1; */ + if(nowx>goalx){ + searchorder[src]=0; + src++; + }else + searchorder[3+src]=0; + if(nowy>goaly){ + searchorder[src]=1; + src++; + }else + searchorder[2+src]=1; + if(nowx0&&available(nowx-1,nowy,0)) + return 1; + break; + case 1: + if(nowy>0&&available(nowx,nowy-1,0)) + return 1; + break; + case 2: + if(nowx0){ + found=0; + for(j=0;j0){ board_beta[x+block_data[blockid][1][0]] [y+block_data[blockid][1][1]]=block_data[blockid][1][2]; - add_point(blockid,block_data[blockid][1][2]); + update_ranks(); }else{ board_beta[x+block_data[blockid][1][0]] [y+block_data[blockid][1][1]]=SHRT_MIN; } @@ -196,27 +443,18 @@ void place_block(short int blockid,short int x,short int y){ for(i=2;i<=4;i++) if(block_data[blockid][i][2]>0){ board_beta[x+block_data[blockid][i][0]] [y+block_data[blockid][i][1]]=block_data[blockid][i][2]; - add_point(blockid,block_data[blockid][i][2]); + update_ranks(); }else{ board_beta[x+block_data[blockid][i][0]] [y+block_data[blockid][i][1]]=SHRT_MIN; } } - return; -} - -void erase_line(short int lineid){ - short int i,j; - if(lineid==0) - return; - for(i=0;i0){ //if block exists - if(block_data[i][j][2]==block_data[blockid][1][2]){ //if edge exists - point[i]-=10; - }else if(block_data[blockid][2][2]!=-1){ //if not monomino - if(block_data[i][j][2]==block_data[blockid][2][2]){ //if edge exists - point[i]-=10; - } - if(block_data[i][j][2]==block_data[blockid][3][2]){ //if edge exists - point[i]-=10; - } - if(block_data[i][j][2]==block_data[blockid][4][2]){ //if edge exists - point[i]-=10; - } - } - } - } - update_ranks(); + sub_point(blockid); return; } short int place_and_line(short int blockid){ short int i,j; + if(DEBUG){ + printf("#%d RANKS (rank: block, point)\n",attempts); + for(i=1;i<=blocks;i++){ + printf(" %d: %d, %d\n",i,rank[i],point[rank[i]]); + } + } if(first_block==1){ first_block--; place_block(blockid,MAXSIZE/2,MAXSIZE/2); + point[blockid]=-point[blockid]; + update_ranks(); + if(DEBUG){ + printf("#%d Block %d placed @(%d,%d)\n",attempts,blockid,block_data[blockid][0][0],block_data[blockid][0][1]); + print_board_beta(); + } return 1; } j=search_placable(blockid); for(i=1;i<=j;i++){ + /* printf("place: block %d\n",blockid); */ place_block(blockid,costrank[i][0],costrank[i][1]); - if(try_wire(blockid)) + if(try_wires(blockid)){ + point[blockid]=-point[blockid]; + update_ranks(); return 1; + } remove_block(blockid); } return 0; } -void solve(void){ //solver part - short int i, flag, in_process=1; +void solve(short int seed){ //solver part + short int i, in_process=1; + srand(seed); while(in_process){ - flag=1; - for(i=1;i<=blocks;i++) - if(block_data[rank[i]][0][0]<0){ //not placed - if(!place_and_line(rank[i])){ //if not placable + if(DEBUG){ + printf("\n#%d attempt\n",attempts); + } + while(1){ + i=rank[1]; + if(block_data[i][0][0]<0){ //not placed + if(!place_and_line(i)){ //if not placable point[i]+=100; - if(point[i]>10000){ //no answer - printf("Too many attempts!\n"); + if(point[i]>10000||attempts>=100){ //no answer + printf("Too many trials!\n"); in_process=0; //end solver break; } + shuffle_random(rand()); reset(); break; //solve from beginning } - flag=0; - } - if(flag) - break; + }else + return; + } + attempts++; } return; } @@ -339,9 +579,12 @@ void translate(void){ //translate bigboard to minimal board } void solver(void){ + short int seed=time(NULL); //edit here + /* short int seed=1; //edit here */ + shuffle_random(seed); init_points(); reset(); - solve(); + solve(seed); /* shape(); */ /* print_board_beta(); */ translate();