/* solver.c */ /* Last Change: 2019/05/21 (Tue) 18:09:17. */ #include #include"solver.h" #include"io.h" #include //#include #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]; short int line_board[72][72]; short int mino_board[72][72]; short int put_data[72][72]; short int success=0; short int answerw=0,answerh=0; 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(put_data[x+block_data[i][j][0]][y+block_data[i][j][1]]!=0){ return 0; } if(flag==0){ if(check_around(x+block_data[i][j][0],y+block_data[i][j][1])){ return 0; } } } return 1; } int data_mino(int i, int x,int y,int flag){ //std::cout << "put mino "<< i << " on " << x <<" " << y << std::endl; for(int j=0;j<100;j++){ if(check_put_mino(i,x,y,flag)){ for(int l=1;l<5;l++){ mino_board[x+block_data[i][l][0]][y+block_data[i][l][1]]=i; if(l==2 && block_data[i][l][2]==-1){ block_data[i][0][0]=x; block_data[i][0][1]=y; return 1; } if(block_data[i][l][2]!=0){ put_data[x+block_data[i][l][0]][y+block_data[i][l][1]]=block_data[i][l][2]; }else{ put_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 1; } x+=(j%2)*SPACE; y+=((j+1)%2)*SPACE; if(x>W || y>H) return 0; } } 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(); for(int i=0;i<=blocks;i++){ done_block[i]=0; } 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--){ //std::cout << done_block[index]; if(done_block[index]==0){ next=index; break; } } //std::cout << endl; 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+1 << std::endl; width_c+=max_w+1; width_c+=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,0); //else data_mino(next_put,width_c+SPACE,height_c,0); data_mino(next_put,width_c+SPACE,height_c,0); 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; } 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] = put_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; line_board[x][y] = board_str[idx]; //put_data[x][y] = board_str[idx]; } } } void make_small(){ int i,j; int maxw=0,maxh=0; for(i=0;imaxw) maxw=i; if(j>maxh) maxh=j; } } } W=maxw+2; H=maxh+2; //cout << "W is " << W << " H is " << H << endl; return; } void make_answer(){ make_small(); for(int i=0;i> move_order; int move=0,check_line=0,mino_dir,flag=0,check_num=0; //std::cout << "start move2line" << std::endl; for(int i=1;i<=blocks;i++){ move_order.push_back(make_pair(block_data[i][0][0]+block_data[i][0][1],i)); } sort(move_order.begin(),move_order.end()); for(int i=0;i> move_order; int move=0,check_line=0,mino_dir,flag=0; int ch=0,cw=0,px,py; //std::cout << "start move2space" << std::endl; for(int i=1;i<=blocks;i++){ move_order.push_back(make_pair(block_data[i][0][0]+block_data[i][0][1],i)); } sort(move_order.begin(),move_order.end()); for(int i=0;icw){ del_mino(move_order[i].second); data_mino(move_order[i].second,px-ch+1,py,1); }else{ del_mino(move_order[i].second); data_mino(move_order[i].second,px,py-cw+1,1); } //cout << "ch " << ch << " cw " << cw << endl; if(line()==0){ while(line()==0){ if(ch>cw){ ch--; del_mino(move_order[i].second); data_mino(move_order[i].second,px-ch+1,py,1); }else{ cw--; del_mino(move_order[i].second); data_mino(move_order[i].second,px,py-cw+1,1); } } } } //cout << "end move2space" << endl; return flag; } int reshape(){ vector< pair> move_order; int next,limit=0,end=5; int flag=0; //std::cout << "start reshape" << std::endl; for(int i=1;i<=blocks;i++){ move_order.push_back(make_pair(block_data[i][0][0]+block_data[i][0][1],i)); } sort(move_order.begin(),move_order.end()); for(int i=1;i<=blocks;i++){ next=move_order[i-1].second; del_mino_line(next); while(true){ if(move_mino(next,1,1)){ //cout << "moved" << endl; flag=1; }else{ break; } limit++; //cout << limit << endl; if(limit>=end) break; } if(flag){ if(line()==0) return 0; } } return flag; } void resize(){ int i,j; int minw=W,maxw=0,minh=H,maxh=0; for(int i=0;imaxw) maxw=i; if(imaxh) maxh=j; if(jmaxw) maxw=i; if(imaxh) maxh=j; if(jmaxx){ maxx=block_data[i][j][0]; } if(block_data[i][j][1]>maxy){ maxy=block_data[i][j][1]; } } cw+=maxx+1; ch+=maxy+1; } W=cw+blocks+1; H=ch+blocks+1; if(W>72 || H>72){ return 1; }else{ return 0; } } void solve(void){ int limit=0,end=15,check_space=0,check_line=0,flag=0; if(make_board()){ printf("too large\n"); return; } //std::cout << "height is " << H <<" width is "<< W << std::endl; init_mino(); put_mino(); line(); for(int i=0;i=end) break; }*/ //line(); resize(); return; } int solver(void){ read_data(); solve(); /* shape(); */ //translate(); if(w>answerw || h>answerh) success=0; return success; }