/* solver.c */ /* Last Change: 2019/05/21 (Tue) 18:09:17. */ #include #include"solver.h" #include"io.h" #include #include #include #include "router/router.hpp" /* #include */ /* #include */ /* #include */ /* #include */ #define SPACE 1 short int connected[MAXLINE]={0}; //if line connected:2, if one end:1, otherwize:0 short int board_beta[MAXSIZE][MAXSIZE]; //big board data //edge:1~MAXLINE, line:-1~-MAXLINE, none:0, wall:SHRT_MIN short int rank[MAXBLOCK+1]; short int done_block[MAXBLOCK+1]; short int board_str[900]; vector mino_order; void reset_board(void){ int i,j; for(i=0;imaxw) maxw=i; if(imaxh) maxh=j; if(jW-1){ return 0; } if(y+block_data[i][j][1]>H-1){ return 0; } if(board_data[x+block_data[i][j][0]][y+block_data[i][j][1]]!=0){ return 0; } if(check_around(x+block_data[i][j][0],y+block_data[i][j][1])){ return 0; } } return 1; } void data_mino(int i, int x,int y){ std::cout << "put mino "<< i << "on" << x <<" " << y << std::endl; for(int j=0;j<100;j++){ if(check_put_mino(i,x,y)){ for(int l=1;l<5;l++){ if(l==2 && block_data[i][l][2]==-1){ block_data[i][0][0]=x; block_data[i][0][1]=y; return; } if(block_data[i][l][2]!=0){ board_data[x+block_data[i][l][0]][y+block_data[i][l][1]]=block_data[i][l][2]; }else{ board_data[x+block_data[i][l][0]][y+block_data[i][l][1]]=-1; } } block_data[i][0][0]=x; block_data[i][0][1]=y; return; } x+=(j%2)*SPACE; y+=((j+1)%2)*SPACE; if(x>W || y>H) return; } } void put_mino(){ int i,j,k,now; std::vector order_w; std::vector order_h; int map_w[4]={0,0,0,0}; int map_h[4]={0,0,0,0}; int len[MAXBLOCK+1]; int check_block[100];//block in the order_w int done_block[100];//fixed block in the order_w int end; int flag=0; order_w.push_back(1); // start from block#1 int index=0; int next=0; int x=0; int another=0; auto itr=order_w.begin(); while(true){ another=0; for(index=order_w.size()-1;index>=0;index--){ // find next block if(done_block[order_w[index]]==0){ next=order_w[index]; another=1; //done_block[next]=1; //check_block[next]=1; break; } } if(index==-1){ for(index=blocks;index>0;index--){ if(done_block[index]==0){ next=index; break; } } if(index==0) break; // if all blocks are searched } if(index==-1) break; // if all blocks are searched if(another){ itr=order_w.begin(); for(int i=0;i=0;index--){ // find next block if(done_block[order_h[index]]==0){ next=order_h[index]; another=1; break; } } if(index==-1){ std::cout << "left block search" << std::endl; for(index=blocks;index>0;index--){ if(done_block[index]==0){ next=index; break; } } if(index==0) break; // if all blocks are searched } //std::cout << "now" << std::endl; if(another==1){ itr=order_h.begin(); for(int i=0;imax_w) max_w = block_data[order_w[j]][k][0]; } //std::cout<< "add " << order_w[j] << " mino " << max_w << std::endl; width_c+=max_w+SPACE; } //std::cout << width_c << std::endl; //std::cout << height_c << std::endl; if(max_w==0) data_mino(next_put,width_c,height_c); else data_mino(next_put,width_c+SPACE,height_c); for(int k=1;k<5;k++){ if(block_data[next_put][k][1]>max_h) max_h = block_data[next_put][k][1]; } height_c+=max_h+1; } print_answer(); //int next; int mino_x,mino_y; /*for(int i=0;i1;j--){ if(check_put_mino(next,j,mino_y)){ mino_x=j; }else{ break; } } }else{ for(int j=mino_y-1;j>1;j--){ if(check_put_mino(next,mino_x,j)){ mino_y=j; }else{ break; } } } data_mino(next,mino_x,mino_y); }*/ } void make_board_str(int size_x,int size_y){ for(int y = 0; y < size_y; y++) { for(int x = 0; x < size_x; x++) { int idx = y * size_x + x; board_str[idx] = board_data[x][y]; } } } void fix_to_board(int size_x, int size_y){ for(int y = 0; y < size_y; y++) { for(int x = 0; x < size_x; x++) { int idx = y * size_x + x; board_data[x][y] = board_str[idx]; } } } void line(){ make_board_str(W,H); std::cout << lfsr <