diff --git a/main b/main index be6f3afb94aae43b3f4b1e70da19fc5638e8c72a..083231ea6a1c1f8d6af87415c0c1487b22153963 100755 Binary files a/main and b/main differ diff --git a/solver.c b/solver.c index 7ce3133df9c5efc6320f6bc780c3d4ffd8b24e2c..73bac59bc6e3f52ca33f4fcc7c2212e1c5c5f3b1 100644 --- a/solver.c +++ b/solver.c @@ -1,5 +1,5 @@ /* solver.c */ -/* Last Change: 2019/07/25 (Thu) 14:39:28. */ +/* Last Change: 2019/07/29 (Mon) 09:32:40. */ #include #include @@ -151,51 +151,65 @@ short int search_placable(short int blockid){ //calc the cost (sum of Euclidean short int i,j,k,l,index=0; short int place[5][2]; //(relative) place of edge #block_data[blockid][1-4][] (x,y) short int blockw=0,blockh=0; - if(block_data[blockid][2][2]==-1){ //if monomino - return 1; - } /* calc cost */ - for(k=1;k<=4;k++){ - place[k][0]=SHRT_MIN; - place[k][1]=SHRT_MIN; - for(i=0;i0 && board_beta[i][j]==block_data[blockid][k][2]){ - place[k][0]=i-block_data[blockid][k][0]; - place[k][1]=j-block_data[blockid][k][1]; + if(block_data[blockid][2][2]==-1){ //if monomino + for(i=0;i=0&&board_beta[i-1][j]==0) + cost[i-1][j][0]=1; + if(j-1>=0&&board_beta[i][j-1]==0) + cost[i][j-1][0]=1; } + } + }else{ + for(k=1;k<=4;k++){ + place[k][0]=SHRT_MIN; + place[k][1]=SHRT_MIN; + for(i=0;i0 && board_beta[i][j]==block_data[blockid][k][2]){ + place[k][0]=i-block_data[blockid][k][0]; + place[k][1]=j-block_data[blockid][k][1]; + } + } + /* printf("%d, %d\n",place[k][0],place[k][1]); */ } - /* printf("%d, %d\n",place[k][0],place[k][1]); */ - } - for(k=1;k<=4;k++){ - if(block_data[blockid][k][0]>blockw) - blockw=block_data[blockid][k][0]; - if(block_data[blockid][k][1]>blockh) - blockh=block_data[blockid][k][1]; - } - /* printf("%d: %d, %d\n",blockid,blockw,blockh); */ - for(i=0;i=MAXSIZE || j+blockh>=MAXSIZE) //out of board - cost[i][j][0]=-1; - else if( 0!=board_beta[i+block_data[blockid][1][0]] [j+block_data[blockid][1][1]] //alredy something - || 0!=board_beta[i+block_data[blockid][2][0]] [j+block_data[blockid][2][1]] - || 0!=board_beta[i+block_data[blockid][3][0]] [j+block_data[blockid][3][1]] - || 0!=board_beta[i+block_data[blockid][4][0]] [j+block_data[blockid][4][1]]) - cost[i][j][0]=-1; - else{ - cost[i][j][0]=0; - for(k=1;k<=4;k++){ - if(place[k][0]!=SHRT_MIN) - cost[i][j][0]+=ABS(i-place[k][0]); - if(place[k][1]!=SHRT_MIN) - cost[i][j][0]+=ABS(j-place[k][1]); + for(k=1;k<=4;k++){ + if(block_data[blockid][k][0]>blockw) + blockw=block_data[blockid][k][0]; + if(block_data[blockid][k][1]>blockh) + blockh=block_data[blockid][k][1]; + } + /* printf("%d: %d, %d\n",blockid,blockw,blockh); */ + for(i=0;i=MAXSIZE || j+blockh>=MAXSIZE) //out of board + cost[i][j][0]=-1; + else if( 0!=board_beta[i+block_data[blockid][1][0]] [j+block_data[blockid][1][1]] //alredy something + || 0!=board_beta[i+block_data[blockid][2][0]] [j+block_data[blockid][2][1]] + || 0!=board_beta[i+block_data[blockid][3][0]] [j+block_data[blockid][3][1]] + || 0!=board_beta[i+block_data[blockid][4][0]] [j+block_data[blockid][4][1]]) + cost[i][j][0]=-1; + else{ + cost[i][j][0]=0; + for(k=1;k<=4;k++){ + if(place[k][0]!=SHRT_MIN) + cost[i][j][0]+=ABS(i-place[k][0]); + if(place[k][1]!=SHRT_MIN) + cost[i][j][0]+=ABS(j-place[k][1]); + } + if(cost[i][j][0]==0) + 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]); */ } - if(cost[i][j][0]==0) - 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]); */ } } }