diff --git a/a.out b/a.out new file mode 100644 index 0000000000000000000000000000000000000000..eae94a5c9143fbdf58ef72a3b9b9686c0e7a4761 Binary files /dev/null and b/a.out differ diff --git a/info.txt b/info.txt new file mode 100644 index 0000000000000000000000000000000000000000..a740f5b22bf1f3ac19f08dad6de0958133441157 --- /dev/null +++ b/info.txt @@ -0,0 +1,8 @@ +// block_data[0][X][X]は使用しない +// block_data[block#][0][0] ブロックの左上のマスのx座標 (0スタート,未配置なら-1) +// block_data[block#][0][1] ブロックの左上のマスのy座標 (0スタート,未配置なら-1) +// block_data[block#][0][2] 未使用 +// block_data[block#][1~4][X] ブロックを構成するマスの情報 +// block_data[block#][1~4][0] マスの,左上マスからの相対位置 x方向 +// block_data[block#][1~4][1] マスの,左上マスからの相対位置 y方向 +// block_data[block#][1~4][2] マスの端点情報 (数字がなければ0,モノミノで存在しない場合は-1) \ No newline at end of file diff --git a/io.c b/io.c new file mode 100644 index 0000000000000000000000000000000000000000..bdc07f67581df5d3d205b6798f7543bb5f77cc27 --- /dev/null +++ b/io.c @@ -0,0 +1,121 @@ +/* io.c */ +/* Last Change: 2019/06/02 (Sun) 23:53:02. */ + +#include +#include"io.h" + +short int W=MAXW, H=MAXH; // (問題で設定された) 盤面サイズ上限 + +short int w=0, h=0; // 使用する盤面サイズ + +short int blocks=0; // ブロックの数 + +short int block_data[MAXBLOCK+1][5][3]; // ブロックの情報 + +short int board_data[MAXW][MAXH]; // 盤面情報 + +void reset_parameters(void){ + int i,j,k; + for(i=0;iMAXW||W<=0) + printf("Error: width\n"); + scanf(" %c",&c); //X + scanf(" %hd",&H); + if(H>MAXH||H<=0) + printf("Error: height\n"); + scanf(" %s",str); //BLOCK_NUM + scanf(" %hd",&blocks); + if(blocks<0) + printf("Error: blocks\n"); + for(i=1;i<=blocks;i++){ + scanf(" %s",str); //BLOCK#X + scanf(" %d",&x); + if(x>4||x<0) + printf("Error: x\n"); + scanf(" %c",&c); //X + scanf(" %d",&y); + if(y>4||y<0) + printf("Error: y\n"); + nowblock=1; + gets(str); + for(j=0;j +#include"solver.h" +#include"io.h" +#include +#include +#include +/* #include */ +/* #include */ +/* #include */ +/* #include */ + +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]; + +void reset_board(void){ + int i,j; + for(i=0;imaxw) + maxw=i; + if(imaxh) + maxh=j; + if(jW || 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; + auto itr=order_w.begin(); + while(true){ + for(index=order_w.size()-1;index>=0;index--){ // find next block + if(done_block[order_w[index]]==0){ + next=order_w[index]; + //done_block[next]=1; + //check_block[next]=1; + break; + } + } + if(index==-1) break; // if all blocks are searched + 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]; + break; + } + } + //std::cout << "now" << std::endl; + if(index==-1) break; // if all blocks are searched + itr=order_h.begin(); + for(int i=0;i