Commit 6e9f6b34 authored by royus's avatar royus

fix

parent 4795667d
No preview for this file type
/* solver.c */ /* solver.c */
/* Last Change: 2019/07/25 (Thu) 14:39:28. */ /* Last Change: 2019/07/29 (Mon) 09:32:40. */
#include<stdio.h> #include<stdio.h>
#include<limits.h> #include<limits.h>
...@@ -151,51 +151,65 @@ short int search_placable(short int blockid){ //calc the cost (sum of Euclidean ...@@ -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 i,j,k,l,index=0;
short int place[5][2]; //(relative) place of edge #block_data[blockid][1-4][] (x,y) short int place[5][2]; //(relative) place of edge #block_data[blockid][1-4][] (x,y)
short int blockw=0,blockh=0; short int blockw=0,blockh=0;
if(block_data[blockid][2][2]==-1){ //if monomino
return 1;
}
/* calc cost */ /* calc cost */
for(k=1;k<=4;k++){ if(block_data[blockid][2][2]==-1){ //if monomino
place[k][0]=SHRT_MIN; for(i=0;i<MAXSIZE;i++)
place[k][1]=SHRT_MIN; for(j=0;j<MAXSIZE;j++){
for(i=0;i<MAXSIZE;i++){ cost[i][j][0]=0;
for(j=0;j<MAXSIZE;j++) if(board_beta[i][j]==block_data[blockid][1][2]){
if(board_beta[i][j]>0 && board_beta[i][j]==block_data[blockid][k][2]){ if(i+1<MAXSIZE&&board_beta[i+1][j]==0)
place[k][0]=i-block_data[blockid][k][0]; cost[i+1][j][0]=1;
place[k][1]=j-block_data[blockid][k][1]; if(j+1<MAXSIZE&&board_beta[i][j+1]==0)
cost[i][j+1][0]=1;
if(i-1>=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;i<MAXSIZE;i++){
for(j=0;j<MAXSIZE;j++)
if(board_beta[i][j]>0 && 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)
for(k=1;k<=4;k++){ blockw=block_data[blockid][k][0];
if(block_data[blockid][k][0]>blockw) if(block_data[blockid][k][1]>blockh)
blockw=block_data[blockid][k][0]; blockh=block_data[blockid][k][1];
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;i++){
/* printf("%d: %d, %d\n",blockid,blockw,blockh); */ for(j=0;j<MAXSIZE;j++){
for(i=0;i<MAXSIZE;i++){ cost[i][j][1]=1;
for(j=0;j<MAXSIZE;j++){ if(i+blockw>=MAXSIZE || j+blockh>=MAXSIZE) //out of board
cost[i][j][1]=1; cost[i][j][0]=-1;
if(i+blockw>=MAXSIZE || j+blockh>=MAXSIZE) //out of board else if( 0!=board_beta[i+block_data[blockid][1][0]] [j+block_data[blockid][1][1]] //alredy something
cost[i][j][0]=-1; || 0!=board_beta[i+block_data[blockid][2][0]] [j+block_data[blockid][2][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][3][0]] [j+block_data[blockid][3][1]]
|| 0!=board_beta[i+block_data[blockid][2][0]] [j+block_data[blockid][2][1]] || 0!=board_beta[i+block_data[blockid][4][0]] [j+block_data[blockid][4][1]])
|| 0!=board_beta[i+block_data[blockid][3][0]] [j+block_data[blockid][3][1]] cost[i][j][0]=-1;
|| 0!=board_beta[i+block_data[blockid][4][0]] [j+block_data[blockid][4][1]]) else{
cost[i][j][0]=-1; cost[i][j][0]=0;
else{ for(k=1;k<=4;k++){
cost[i][j][0]=0; if(place[k][0]!=SHRT_MIN)
for(k=1;k<=4;k++){ cost[i][j][0]+=ABS(i-place[k][0]);
if(place[k][0]!=SHRT_MIN) if(place[k][1]!=SHRT_MIN)
cost[i][j][0]+=ABS(i-place[k][0]); cost[i][j][0]+=ABS(j-place[k][1]);
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]); */
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment