Commit b5163502 authored by makoto.nishizawa's avatar makoto.nishizawa

change solver

parent ad6fb437
TARGET = sim all: main.cpp io.c solver.cpp router/router.cpp
OBJS = $(CPPS:.cpp=.o) g++ -o solve solver.cpp main.cpp io.c router/router.cpp -std=c++11
CPPS = $(wildcard *.cpp)
CXX = g++ o: main.o io.o solver.o
CXXFLAGS = -O3 -DSOFTWARE g++ -o solve main.o io.o solver.o
all: $(TARGET) main.o: main.cpp
g++ -c main.cpp
$(TARGET): $(OBJS)
$(CXX) -o $@ $(OBJS) io.o: io.c
g++ -c io.c
clean:
rm *.o solver.o: solver.cpp
rm $(TARGET) g++ -c solver.cpp -std=c++11
TARGET = sim
OBJS = $(CPPS:.cpp=.o)
CPPS = $(wildcard *.cpp)
CXX = g++
CXXFLAGS = -O3 -DSOFTWARE
all: $(TARGET)
$(TARGET): $(OBJS)
$(CXX) -o $@ $(OBJS)
clean:
rm *.o
rm $(TARGET)
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -101,17 +101,11 @@ void read_problem(void){ ...@@ -101,17 +101,11 @@ void read_problem(void){
void print_answer(void){ void print_answer(void){
printf("\n --ANSWER-- \n"); //comment out this row printf("\n --ANSWER-- \n"); //comment out this row
int i,j; int i,j;
h=H;
w=W;
printf("SIZE %dX%d\n",w,h); printf("SIZE %dX%d\n",w,h);
for(i=0;i<h;i++){ for(i=0;i<h;i++){
for(j=0;j<w;j++){ for(j=0;j<w;j++){
if(board_data[j][i]!=-1){ printf("%3d",board_data[j][i]);
printf("%d",board_data[j][i]); if(j==w-1)
}else{
printf("*");
}
if(j==h-1)
printf("\n"); printf("\n");
else else
printf(","); printf(",");
......
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
#define MAXBLOCK 5184 // 72*72 #define MAXBLOCK 5184 // 72*72
#define MAXLINE 2592 // 72*72/2 #define MAXLINE 2592 // 72*72/2
#define MAXW 72 #define MAXW 120
#define MAXH 72 #define MAXH 120
extern short int W, H; // (問題で設定された) 盤面サイズ上限 extern short int W, H; // (問題で設定された) 盤面サイズ上限
......
...@@ -2,11 +2,10 @@ ...@@ -2,11 +2,10 @@
/* Last Change: 2019/05/21 (Tue) 14:44:03. */ /* Last Change: 2019/05/21 (Tue) 14:44:03. */
#include"io.h" #include"io.h"
#include"solver.h" #include"solver.h"
#include <stdio.h>
int main(void){ int main(void){
read_problem(); read_problem();
H=40;
W=40;
solver(); solver();
print_answer(); print_answer();
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
using namespace std; using namespace std;
#define ROUND_LIMIT 32768 // Max=65534(=2^16-2) #define ROUND_LIMIT 8192//4096//32768 // Max=65534(=2^16-2)
#define PRINT_BOARD #define PRINT_BOARD
//#define PRINT_SEARCH // for router debug //#define PRINT_SEARCH // for router debug
......
No preview for this file type
...@@ -21,6 +21,9 @@ short int board_beta[MAXSIZE][MAXSIZE]; //big board data ...@@ -21,6 +21,9 @@ short int board_beta[MAXSIZE][MAXSIZE]; //big board data
short int rank[MAXBLOCK+1]; short int rank[MAXBLOCK+1];
short int done_block[MAXBLOCK+1]; short int done_block[MAXBLOCK+1];
short int board_str[900]; short int board_str[900];
short int line_board[72][72];
short int mino_board[72][72];
short int put_data[72][72];
vector <int> mino_order; vector <int> mino_order;
void reset_board(void){ void reset_board(void){
...@@ -76,7 +79,7 @@ void translate(void){ ...@@ -76,7 +79,7 @@ void translate(void){
} }
for(i=0;i<maxw-minw;i++){ for(i=0;i<maxw-minw;i++){
for(j=0;j<maxh-minh;j++){ for(j=0;j<maxh-minh;j++){
board_data[i][j]=board_beta[i+minw][j+minh]; put_data[i][j]=board_beta[i+minw][j+minh];
} }
} }
return; return;
...@@ -90,8 +93,8 @@ void init_mino(void){ ...@@ -90,8 +93,8 @@ void init_mino(void){
} }
int check_around(int x,int y){ int check_around(int x,int y){
if(board_data[x+1][y] || board_data[x][y+1] || board_data[x-1][y] || board_data[x][y-1]|| if(put_data[x+1][y] || put_data[x][y+1] || put_data[x-1][y] || put_data[x][y-1]||
board_data[x+1][y+1]||board_data[x+1][y-1]||board_data[x-1][y-1]||board_data[x-1][y+1]) return 1; put_data[x+1][y+1]||put_data[x+1][y-1]||put_data[x-1][y-1]||put_data[x-1][y+1]) return 1;
else{ else{
return 0; return 0;
} }
...@@ -101,13 +104,13 @@ void del_mino(int mino){ ...@@ -101,13 +104,13 @@ void del_mino(int mino){
x=block_data[mino][0][0]; x=block_data[mino][0][0];
y=block_data[mino][0][1]; y=block_data[mino][0][1];
for(int i=1;i<5;i++){ for(int i=1;i<5;i++){
board_data[x+block_data[mino][i][0]][y+block_data[mino][i][1]]=0; put_data[x+block_data[mino][i][0]][y+block_data[mino][i][1]]=0;
} }
block_data[mino][0][0]=-1; block_data[mino][0][0]=-1;
block_data[mino][0][1]=-1; block_data[mino][0][1]=-1;
} }
int check_put_mino(int i,int x, int y){// check block#i can put on x,y int check_put_mino(int i,int x, int y,int flag){// check block#i can put on x,y
for(int j=1;j<5;j++){ for(int j=1;j<5;j++){
if(x+block_data[i][j][0]>W-1){ if(x+block_data[i][j][0]>W-1){
return 0; return 0;
...@@ -115,40 +118,43 @@ int check_put_mino(int i,int x, int y){// check block#i can put on x,y ...@@ -115,40 +118,43 @@ int check_put_mino(int i,int x, int y){// check block#i can put on x,y
if(y+block_data[i][j][1]>H-1){ if(y+block_data[i][j][1]>H-1){
return 0; return 0;
} }
if(board_data[x+block_data[i][j][0]][y+block_data[i][j][1]]!=0){ if(put_data[x+block_data[i][j][0]][y+block_data[i][j][1]]!=0){
return 0; return 0;
} }
if(check_around(x+block_data[i][j][0],y+block_data[i][j][1])){ if(flag==0){
return 0; if(check_around(x+block_data[i][j][0],y+block_data[i][j][1])){
return 0;
}
} }
} }
return 1; return 1;
} }
void data_mino(int i, int x,int y){ int data_mino(int i, int x,int y,int flag){
std::cout << "put mino "<< i << "on" << x <<" " << y << std::endl; std::cout << "put mino "<< i << " on " << x <<" " << y << std::endl;
for(int j=0;j<100;j++){ for(int j=0;j<100;j++){
if(check_put_mino(i,x,y)){ if(check_put_mino(i,x,y,flag)){
for(int l=1;l<5;l++){ 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){ if(l==2 && block_data[i][l][2]==-1){
block_data[i][0][0]=x; block_data[i][0][0]=x;
block_data[i][0][1]=y; block_data[i][0][1]=y;
return; return 1;
} }
if(block_data[i][l][2]!=0){ 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]; put_data[x+block_data[i][l][0]][y+block_data[i][l][1]]=block_data[i][l][2];
}else{ }else{
board_data[x+block_data[i][l][0]][y+block_data[i][l][1]]=-1; 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][0]=x;
block_data[i][0][1]=y; block_data[i][0][1]=y;
return; return 1;
} }
x+=(j%2)*SPACE; x+=(j%2)*SPACE;
y+=((j+1)%2)*SPACE; y+=((j+1)%2)*SPACE;
if(x>W || y>H) return; if(x>W || y>H) return 0;
} }
} }
...@@ -169,6 +175,9 @@ void put_mino(){ ...@@ -169,6 +175,9 @@ void put_mino(){
int x=0; int x=0;
int another=0; int another=0;
auto itr=order_w.begin(); auto itr=order_w.begin();
for(int i=0;i<=blocks;i++){
done_block[i]=0;
}
while(true){ while(true){
another=0; another=0;
for(index=order_w.size()-1;index>=0;index--){ // find next block for(index=order_w.size()-1;index>=0;index--){ // find next block
...@@ -182,11 +191,13 @@ void put_mino(){ ...@@ -182,11 +191,13 @@ void put_mino(){
} }
if(index==-1){ if(index==-1){
for(index=blocks;index>0;index--){ for(index=blocks;index>0;index--){
std::cout << done_block[index];
if(done_block[index]==0){ if(done_block[index]==0){
next=index; next=index;
break; break;
} }
} }
std::cout << endl;
if(index==0) break; // if all blocks are searched if(index==0) break; // if all blocks are searched
} }
if(index==-1) break; // if all blocks are searched if(index==-1) break; // if all blocks are searched
...@@ -199,10 +210,10 @@ void put_mino(){ ...@@ -199,10 +210,10 @@ void put_mino(){
}else{ }else{
itr=order_w.end(); itr=order_w.end();
} }
std::cout << "block#"<<next << std::endl; //std::cout << "block#"<<next << std::endl;
//make block order //make block order
if(block_data[next][1][0]==block_data[next][2][0]){ if(block_data[next][1][0]==block_data[next][2][0]){
std::cout << "patern 1"<< std::endl; //std::cout << "patern 1"<< std::endl;
if(block_data[next][2][0]==block_data[next][3][0] || block_data[next][2][1]==block_data[next][4][1]){//for I-mino1,L-mino1,T-mino1,S-mino1,Lf-mino4 if(block_data[next][2][0]==block_data[next][3][0] || block_data[next][2][1]==block_data[next][4][1]){//for I-mino1,L-mino1,T-mino1,S-mino1,Lf-mino4
map_w[0]=block_data[next][1][2]; map_w[0]=block_data[next][1][2];
map_w[1]=block_data[next][2][2]; map_w[1]=block_data[next][2][2];
...@@ -215,13 +226,13 @@ void put_mino(){ ...@@ -215,13 +226,13 @@ void put_mino(){
map_w[3]=block_data[next][3][2]; map_w[3]=block_data[next][3][2];
} }
}else if(block_data[next][1][1]==block_data[next][4][1]){//I-mino2 }else if(block_data[next][1][1]==block_data[next][4][1]){//I-mino2
std::cout << "patern 2"<< std::endl; //std::cout << "patern 2"<< std::endl;
map_w[0]=block_data[next][1][2]; map_w[0]=block_data[next][1][2];
map_w[1]=block_data[next][2][2]; map_w[1]=block_data[next][2][2];
map_w[2]=block_data[next][3][2]; map_w[2]=block_data[next][3][2];
map_w[3]=block_data[next][4][2]; map_w[3]=block_data[next][4][2];
}else if(block_data[next][1][1]==block_data[next][2][1]){ }else if(block_data[next][1][1]==block_data[next][2][1]){
std::cout << "patern 3"<< std::endl; //std::cout << "patern 3"<< std::endl;
if(block_data[next][1][0]==block_data[next][4][0]){//L-mino4 if(block_data[next][1][0]==block_data[next][4][0]){//L-mino4
map_w[0]=block_data[next][1][2]; map_w[0]=block_data[next][1][2];
map_w[1]=block_data[next][4][2]; map_w[1]=block_data[next][4][2];
...@@ -246,10 +257,11 @@ void put_mino(){ ...@@ -246,10 +257,11 @@ void put_mino(){
map_w[2]=block_data[next][3][2]; map_w[2]=block_data[next][3][2];
map_w[3]=block_data[next][4][2]; map_w[3]=block_data[next][4][2];
} }
for(int k=0;k<4;k++){ /*for(int k=0;k<4;k++){
std::cout << map_w[k]<<" "; std::cout << map_w[k]<<" ";
} }*/
std::cout << std::endl; //std::cout << std::endl;
//done_block[next]=1;
for(int k=0;k<4;k++){ for(int k=0;k<4;k++){
if(map_w[k]==0) continue; if(map_w[k]==0) continue;
flag=0; flag=0;
...@@ -257,7 +269,7 @@ void put_mino(){ ...@@ -257,7 +269,7 @@ void put_mino(){
if(i==next) continue; if(i==next) continue;
for(int j=1;j<=4;j++){// find pair block for(int j=1;j<=4;j++){// find pair block
if(block_data[i][j][2]==map_w[k]){ if(block_data[i][j][2]==map_w[k]){
std::cout << k << " " << map_w[k]<< "found at " << i << std::endl; //std::cout << k << " " << map_w[k]<< "found at " << i << std::endl;
if(check_block[i]==1 || done_block[i]==1){ if(check_block[i]==1 || done_block[i]==1){
map_w[k]=0; map_w[k]=0;
}else{ }else{
...@@ -282,18 +294,18 @@ void put_mino(){ ...@@ -282,18 +294,18 @@ void put_mino(){
itr++; itr++;
} }
done_block[next]=1; done_block[next]=1;
for(int i=0;i<order_w.size();i++){ /*for(int i=0;i<order_w.size();i++){
printf("%d ",order_w[i]); printf("%d ",order_w[i]);
} }
printf("\n"); printf("\n");*/
x++; x++;
if(x==10)break; //if(x==10)break;
}//end of while ture for width }//end of while ture for width
printf("answer is \n"); /*printf("answer is \n");
for(int i=0;i<order_w.size();i++){ for(int i=0;i<order_w.size();i++){
printf("%d ",order_w[i]); printf("%d ",order_w[i]);
} }
printf("\n"); printf("\n");*/
...@@ -317,7 +329,7 @@ void put_mino(){ ...@@ -317,7 +329,7 @@ void put_mino(){
} }
} }
if(index==-1){ if(index==-1){
std::cout << "left block search" << std::endl; //std::cout << "left block search" << std::endl;
for(index=blocks;index>0;index--){ for(index=blocks;index>0;index--){
if(done_block[index]==0){ if(done_block[index]==0){
next=index; next=index;
...@@ -336,14 +348,14 @@ void put_mino(){ ...@@ -336,14 +348,14 @@ void put_mino(){
}else{ }else{
itr=order_h.end(); itr=order_h.end();
} }
std::cout << "block#"<<next << std::endl; /*std::cout << "block#"<<next << std::endl;
for(int k=1;k<=4;k++){ for(int k=1;k<=4;k++){
std::cout << block_data[next][k][0]; std::cout << block_data[next][k][0];
} }
std::cout << std::endl; std::cout << std::endl;*/
//make block order //make block order
if(block_data[next][1][1]==block_data[next][2][1]){ if(block_data[next][1][1]==block_data[next][2][1]){
std::cout << "patern 1"<< std::endl; //std::cout << "patern 1"<< std::endl;
if(block_data[next][3][1]==block_data[next][4][1]){//for I-mino2,S-mino2,Sf-mino2,O-mino if(block_data[next][3][1]==block_data[next][4][1]){//for I-mino2,S-mino2,Sf-mino2,O-mino
map_h[0]=block_data[next][1][2]; map_h[0]=block_data[next][1][2];
map_h[1]=block_data[next][2][2]; map_h[1]=block_data[next][2][2];
...@@ -356,13 +368,13 @@ void put_mino(){ ...@@ -356,13 +368,13 @@ void put_mino(){
map_h[3]=block_data[next][4][2]; map_h[3]=block_data[next][4][2];
} }
}else if(block_data[next][1][0]==block_data[next][4][0]){//I-mino1 }else if(block_data[next][1][0]==block_data[next][4][0]){//I-mino1
std::cout << "patern 2"<< std::endl; //std::cout << "patern 2"<< std::endl;
map_h[0]=block_data[next][1][2]; map_h[0]=block_data[next][1][2];
map_h[1]=block_data[next][2][2]; map_h[1]=block_data[next][2][2];
map_h[2]=block_data[next][3][2]; map_h[2]=block_data[next][3][2];
map_h[3]=block_data[next][4][2]; map_h[3]=block_data[next][4][2];
}else if(block_data[next][1][0]==block_data[next][2][0]){ }else if(block_data[next][1][0]==block_data[next][2][0]){
std::cout << "patern 3"<< std::endl; //std::cout << "patern 3"<< std::endl;
if(block_data[next][3][1]==block_data[next][4][1]){//L-mino1,Lf-mino1 if(block_data[next][3][1]==block_data[next][4][1]){//L-mino1,Lf-mino1
map_h[0]=block_data[next][1][2]; map_h[0]=block_data[next][1][2];
map_h[1]=block_data[next][2][2]; map_h[1]=block_data[next][2][2];
...@@ -375,22 +387,23 @@ void put_mino(){ ...@@ -375,22 +387,23 @@ void put_mino(){
map_h[3]=block_data[next][2][2]; map_h[3]=block_data[next][2][2];
} }
}else if(block_data[next][1][0]==block_data[next][3][0]&&block_data[next][4][1]!=1){//T-mino3,Sf-mino1 }else if(block_data[next][1][0]==block_data[next][3][0]&&block_data[next][4][1]!=1){//T-mino3,Sf-mino1
std::cout << "patern 4"<< std::endl; //std::cout << "patern 4"<< std::endl;
map_h[0]=block_data[next][2][2]; map_h[0]=block_data[next][2][2];
map_h[1]=block_data[next][1][2]; map_h[1]=block_data[next][1][2];
map_h[2]=block_data[next][3][2]; map_h[2]=block_data[next][3][2];
map_h[3]=block_data[next][4][2]; map_h[3]=block_data[next][4][2];
}else{//L-mino2,T-mino2 }else{//L-mino2,T-mino2
std::cout << "patern 5"<< std::endl; //std::cout << "patern 5"<< std::endl;
map_h[0]=block_data[next][2][2]; map_h[0]=block_data[next][2][2];
map_h[1]=block_data[next][1][2]; map_h[1]=block_data[next][1][2];
map_h[2]=block_data[next][4][2]; map_h[2]=block_data[next][4][2];
map_h[3]=block_data[next][3][2]; map_h[3]=block_data[next][3][2];
} }
for(int k=0;k<4;k++){ /*for(int k=0;k<4;k++){
std::cout << map_h[k]<<" "; std::cout << map_h[k]<<" ";
} }
std::cout << std::endl; std::cout << std::endl;*/
//done_block[next]=1;
for(int k=0;k<4;k++){ for(int k=0;k<4;k++){
if(map_h[k]==0) continue; if(map_h[k]==0) continue;
flag=0; flag=0;
...@@ -398,7 +411,7 @@ void put_mino(){ ...@@ -398,7 +411,7 @@ void put_mino(){
if(i==next) continue; if(i==next) continue;
for(int j=1;j<=4;j++){// find pair block for(int j=1;j<=4;j++){// find pair block
if(block_data[i][j][2]==map_h[k]){ if(block_data[i][j][2]==map_h[k]){
std::cout << k << " " << map_h[k]<< "found at " << i << std::endl; //std::cout << k << " " << map_h[k]<< "found at " << i << std::endl;
if(check_block[i]==1 || done_block[i]==1){ if(check_block[i]==1 || done_block[i]==1){
map_h[k]=0; map_h[k]=0;
}else{ }else{
...@@ -422,10 +435,11 @@ void put_mino(){ ...@@ -422,10 +435,11 @@ void put_mino(){
itr=order_h.insert(itr,map_h[i]); itr=order_h.insert(itr,map_h[i]);
itr++; itr++;
} }
/*
for(int i=0;i<order_h.size();i++){ for(int i=0;i<order_h.size();i++){
printf("%d ",order_h[i]); printf("%d ",order_h[i]);
} }
printf("\n"); printf("\n");*/
done_block[next]=1; done_block[next]=1;
//x++; //x++;
//if(x==1)break; //if(x==1)break;
...@@ -450,22 +464,27 @@ void put_mino(){ ...@@ -450,22 +464,27 @@ void put_mino(){
int max_h=0; int max_h=0;
for(int i=0;i<blocks;i++){ for(int i=0;i<blocks;i++){
height_c=height_c+SPACE; height_c=height_c+SPACE;
width_c=SPACE; width_c=0;
max_w=0; max_w=0;
max_h=0; max_h=0;
next_put = order_h[i]; next_put = order_h[i];
for(int j=0;j<blocks;j++){ for(int j=0;j<blocks;j++){
if(order_w[j]==next_put) break; if(order_w[j]==next_put) break;
max_w=0;
for(k=1;k<5;k++){ for(k=1;k<5;k++){
if(block_data[order_w[j]][k][0]>max_w) max_w = block_data[order_w[j]][k][0]; if(block_data[order_w[j]][k][0]>max_w){
max_w = block_data[order_w[j]][k][0];
}
} }
//std::cout<< "add " << order_w[j] << " mino " << max_w << std::endl; std::cout<< "add " << order_w[j] << " mino " << max_w+1 << std::endl;
width_c+=max_w+SPACE; width_c+=max_w+1;
width_c+=SPACE;
} }
//std::cout << width_c << std::endl; //std::cout << width_c << std::endl;
//std::cout << height_c << std::endl; //std::cout << height_c << std::endl;
if(max_w==0) data_mino(next_put,width_c,height_c); //if(max_w==0) data_mino(next_put,width_c,height_c,0);
else data_mino(next_put,width_c+SPACE,height_c); //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++){ for(int k=1;k<5;k++){
if(block_data[next_put][k][1]>max_h) max_h = block_data[next_put][k][1]; if(block_data[next_put][k][1]>max_h) max_h = block_data[next_put][k][1];
} }
...@@ -504,7 +523,7 @@ void make_board_str(int size_x,int size_y){ ...@@ -504,7 +523,7 @@ void make_board_str(int size_x,int size_y){
for(int y = 0; y < size_y; y++) { for(int y = 0; y < size_y; y++) {
for(int x = 0; x < size_x; x++) { for(int x = 0; x < size_x; x++) {
int idx = y * size_x + x; int idx = y * size_x + x;
board_str[idx] = board_data[x][y]; board_str[idx] = put_data[x][y];
} }
} }
} }
...@@ -512,28 +531,505 @@ void fix_to_board(int size_x, int size_y){ ...@@ -512,28 +531,505 @@ void fix_to_board(int size_x, int size_y){
for(int y = 0; y < size_y; y++) { for(int y = 0; y < size_y; y++) {
for(int x = 0; x < size_x; x++) { for(int x = 0; x < size_x; x++) {
int idx = y * size_x + x; int idx = y * size_x + x;
board_data[x][y] = board_str[idx]; 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;i<W;i++){
for(j=0;j<H;j++){
if(line_board[i][j]){
if(i>maxw)
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<H;i++){
for(int j=0;j<W;j++){
board_data[i][j]=line_board[i][j];
}
}
}
void line(){ int line(){
make_board_str(W,H); make_board_str(W,H);
std::cout << lfsr <<std::endl; std::cout << lfsr <<std::endl;
int status = router(W, H, line_num, board_str); int status = router(W, H, line_num, board_str);
if(status){ fix_to_board(W,H);
if(status){
std::cout << "success to line" << std::endl; std::cout << "success to line" << std::endl;
make_answer();
}else{ }else{
std::cout << "failed to line" << std::endl; std::cout << "failed to line" << std::endl;
} }
fix_to_board(W,H); return status;
}
void del_mino_line(int mino){
int x,y;
x=block_data[mino][0][0];
y=block_data[mino][0][1];
for(int i=1;i<5;i++){
line_board[x+block_data[mino][i][0]][y+block_data[mino][i][1]]=0;
}
}
int check_move_mino(int i,int x, int y){// check block#i can put on x,y
for(int j=1;j<5;j++){
if(block_data[i][j][2]==-1) return 1;
if(x+block_data[i][j][0]<0){
return 0;
}
if(y+block_data[i][j][1]<0){
return 0;
}
//cout << "check to " << x+block_data[i][j][0]+block_data[i][0][0] << " " << y+block_data[i][j][1]+block_data[i][0][1] << endl;
//if(line_board[x+block_data[i][j][0]+block_data[i][0][0]][y+block_data[i][j][1]+block_data[i][0][1]]!=0 && line_board[x+block_data[i][j][0]+block_data[i][0][0]][y+block_data[i][j][1]+block_data[i][0][1]]!=put_data[block_data[i][j][0]+block_data[i][0][0]][block_data[i][j][1]+block_data[i][0][1]]){
// return 0;
//}
if(line_board[x+block_data[i][j][0]][y+block_data[i][j][1]]!=0){
return 0;
}
// line_board[x+block_data[i][j][0]+block_data[i][0][0]][y+block_data[i][j][1]+block_data[i][0][1]]=0;
}
return 1;
}
int move_mino(int mino,int x, int y){ //1:success 2:failed
int move_x=0,move_y=0;
int mino_x,mino_y;
//cout << "move from" << block_data[mino][0][0]<<" "<<block_data[mino][0][1]<< endl;
for(int i=1;i<=y;i++){
if(block_data[mino][0][1]-i<0) break;
if(check_move_mino(mino,-move_x,-i)){
move_y=i;
}else{
break;
}
}
for(int i=1;i<=x;i++){
if(block_data[mino][0][0]-i<0) break;
if(check_move_mino(mino,-i,-move_y)){
move_x=i;
}else{
break;
}
}
std::cout << "mino " << mino << " can move " << move_x << " " << move_y << std::endl;
if(move_x!=0 || move_y!=0){
mino_x=block_data[mino][0][0];
mino_y=block_data[mino][0][1];
del_mino(mino);
data_mino(mino,mino_x-move_x,mino_y-move_y,1);
return 1;
}else{
return 0;
}
}
int set_line(int mino){//
for(int i=1;i<=4;i++){
if(block_data[mino][i][2]==0) continue;
if(line_board[block_data[mino][0][0]+block_data[mino][i][0]][block_data[mino][0][1]+block_data[mino][i][1]-1]==block_data[mino][i][2]) return block_data[mino][i][2];
}
for(int i=1;i<=4;i++){
if(block_data[mino][i][2]==0) continue;
if(line_board[block_data[mino][0][0]+block_data[mino][i][0]-1][block_data[mino][0][1]+block_data[mino][i][1]]==block_data[mino][i][2]) return block_data[mino][i][2];
}
return 0;
}
int move_dir(int mino, int l){// 1:left 0:up
for(int i=1;i<=4;i++){
if(block_data[mino][i][2]!=l) continue;
if(line_board[block_data[mino][0][0]+block_data[mino][i][0]-1][block_data[mino][0][1]+block_data[mino][i][1]]==block_data[mino][i][2]) return 1;
if(line_board[block_data[mino][0][0]+block_data[mino][i][0]][block_data[mino][0][1]+block_data[mino][i][1]-1]==block_data[mino][i][2]) return 0;
}
return -1;
}
int move_along_line(int mino, int l,int dir,int check_num){
int count=1,num=0;
int new_x=block_data[mino][0][0],new_y=block_data[mino][0][1],flag=0;
int mino_x=block_data[mino][0][0],mino_y=block_data[mino][0][1];
for(int i=1;i<=4;i++){
if(block_data[mino][i][2]==l){
num=i;
break;
}
}
del_mino_line(mino);
del_mino(mino);
while(true){
flag=0;
if(dir==1){
if(line_board[mino_x+block_data[mino][check_num][0]-count][mino_y+block_data[mino][check_num][1]]!=l) break;
for(int i=1;i<=4;i++){
cout << i << endl;
if(mino_x+block_data[mino][i][0]-count<1){
cout << "out of grid x " << endl;
flag=1;
break;
}
//if(i==check_num) continue;
if(line_board[mino_x+block_data[mino][i][0]-count][mino_y+block_data[mino][i][1]]!=block_data[mino][i][2] && line_board[mino_x+block_data[mino][i][0]-count][mino_y+block_data[mino][i][1]]!=0){
// if any block numbers in mino are not 0/same as the target cell
if(mino_x+block_data[mino][i][0]-count<2){ //see one more cell
flag=1;
break;
}
if(line_board[mino_x+block_data[mino][i][0]-count][mino_y+block_data[mino][i][1]]==l && (line_board[mino_x+block_data[mino][i][0]-count-1][mino_y+block_data[mino][i][1]]==0 || line_board[mino_x+block_data[mino][i][0]-count-1][mino_y+block_data[mino][i][1]]==l) &&put_data[mino_x+block_data[mino][i][0]-count-1][mino_y+block_data[mino][i][1]]==0){
cout <<"continue" << endl;
cout << mino_x+block_data[mino][i][0]-count << " " << mino_y+block_data[mino][i][1] << " " << line_board[mino_x+block_data[mino][i][0]-count][mino_y+block_data[mino][i][1]] <<endl;
cout << mino_x+block_data[mino][i][0]-count-1 << " " << mino_y+block_data[mino][i][1] << " " << line_board[mino_x+block_data[mino][i][0]-count-1][mino_y+block_data[mino][i][1]] <<endl;
//line_board[mino_x+block_data[mino][i][0]-count-1][mino_y+block_data[mino][i][1]]=l;
continue;
}
flag=1;
cout << "cannot move x" << endl;
cout << i << " " << check_num << endl;
break;
}else{
cout << "pass x" << endl;
}
if(line_board[mino_x+block_data[mino][i][0]-count][mino_y+block_data[mino][i][1]]==l && (line_board[mino_x+block_data[mino][i][0]-count-1][mino_y+block_data[mino][i][1]]!=0 && line_board[mino_x+block_data[mino][i][0]-count-1][mino_y+block_data[mino][i][1]]!=l)){
flag=1;
cout << "break" << endl;
cout << mino_x+block_data[mino][i][0]-count << " " << mino_y+block_data[mino][i][1] << " " << line_board[mino_x+block_data[mino][i][0]-count][mino_y+block_data[mino][i][1]] <<endl;
cout << mino_x+block_data[mino][i][0]-count-1 << " " << mino_y+block_data[mino][i][1] << " " << line_board[mino_x+block_data[mino][i][0]-count-1][mino_y+block_data[mino][i][1]] <<endl;
break;
}
line_board[mino_x+block_data[mino][check_num][0]-count][mino_y+block_data[mino][check_num][1]]=0;
}
if(flag) break;
new_x--;
line_board[mino_x+block_data[mino][check_num][0]-count][mino_y+block_data[mino][check_num][1]]=0;
cout << "move left" << endl;
}else{
if(line_board[mino_x+block_data[mino][check_num][0]][mino_y+block_data[mino][check_num][1]-count]!=l) break;
for(int i=1;i<=4;i++){
if(mino_y+block_data[mino][i][1]-count<1){
flag=1;
cout << "out of grid y" << endl;
break;
}
//if(i==check_num) continue;
if(line_board[mino_x+block_data[mino][i][0]][mino_y+block_data[mino][i][1]-count]!=block_data[mino][i][2] && line_board[mino_x+block_data[mino][i][0]][mino_y+block_data[mino][i][1]-count]!=0){
if(mino_y+block_data[mino][i][1]-count<2){ //see one more cell
flag=1;
break;
}
if(line_board[mino_x+block_data[mino][i][0]][mino_y+block_data[mino][i][1]-count]==l && (line_board[mino_x+block_data[mino][i][0]][mino_y+block_data[mino][i][1]-count-1]==l || line_board[mino_x+block_data[mino][i][0]][mino_y+block_data[mino][i][1]-count-1]==0)){
line_board[mino_x+block_data[mino][i][0]][mino_y+block_data[mino][i][1]-count-1]=l;
continue;
}
flag=1;
cout << "can not move y" << endl;
cout << i << " " << check_num << endl;
break;
}else{
cout << "pass" << endl;
}
if(line_board[mino_x+block_data[mino][i][0]][mino_y+block_data[mino][i][1]-count]==l && (line_board[mino_x+block_data[mino][i][0]][mino_y+block_data[mino][i][1]-count-1]!=0 && line_board[mino_x+block_data[mino][i][0]][mino_y+block_data[mino][i][1]-count-1]!=l)){
flag=1;
cout << "break" << endl;
break;
}
}
if(flag) break;
new_y--;
line_board[mino_x+block_data[mino][check_num][0]][mino_y+block_data[mino][check_num][1]-count]=0;
}
count ++;
}
if(count!=1){
data_mino(mino,new_x,new_y,1);
return 1;
}else{
data_mino(mino,mino_x,mino_y,1);
return 0;
}
}
int set_num(int mino,int line){
for(int i=1;i<=4;i++){
if(block_data[mino][i][2]==line) return i;
}
}
int move2line(){
vector< pair<int,int>> 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<blocks;i++){
flag=0;
check_line=set_line(move_order[i].second);
check_num=set_num(move_order[i].second,check_line);
if(check_line==0) continue;
cout << "move " << move_order[i].second<< " line " <<check_line << endl;
mino_dir=move_dir(move_order[i].second,check_line);
flag = move_along_line(move_order[i].second, check_line,mino_dir,check_num);
if(flag){
line();
move=1;
}
}
return move;
}
int move2space(){
vector< pair<int,int>> 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;i<blocks;i++){
ch=1;
cw=1;
px=block_data[move_order[i].second][0][0];
py=block_data[move_order[i].second][0][1];
del_mino_line(move_order[i].second);
//cout << "move " << move_order[i].second << " at move2space" << endl;
while(check_move_mino(move_order[i].second,px-ch,py)){
ch++;
}
while(check_move_mino(move_order[i].second,px,py-cw)){
cw++;
}
if(ch==1 && cw ==1){
line();
continue;
}
flag=1;
if(ch>cw){
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<int,int>> 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;i<W;i++){
for(int j=0;j<H;j++){
put_data[i][j]=0;
}
}
for(i=0;i<W;i++){
for(j=0;j<H;j++){
if(board_data[i][j]){
if(i>maxw)
maxw=i;
if(i<minw)
minw=i;
if(j>maxh)
maxh=j;
if(j<minh)
minh=j;
}
}
}
for(i=0;i<=maxw-minw;i++){
for(j=0;j<=maxh-minh;j++){
put_data[i][j]=board_data[i+minw][j+minh];
}
}
for(int i=1;i<blocks;i++){
block_data[i][0][0]-=minw;
block_data[i][0][1]-=minh;
}
w=maxw-minw+1;
h=maxh-minh+1;
cout << "w is "<< w << "h is " << endl;
return;
}
void resize2(){
int i,j;
int minw=W,maxw=0,minh=H,maxh=0;
for(int i=0;i<W;i++){
for(int j=0;j<H;j++){
put_data[i][j]=0;
}
}
for(i=0;i<W;i++){
for(j=0;j<H;j++){
if(line_board[i][j]){
if(i>maxw)
maxw=i;
if(i<minw)
minw=i;
if(j>maxh)
maxh=j;
if(j<minh)
minh=j;
}
}
}
for(i=1;i<=blocks;i++){
/* block_data[i][0]-=minw; */
/* block_data[i][1]-=minh; */
}
for(i=0;i<=maxw-minw;i++){
for(j=0;j<=maxh-minh;j++){
put_data[i][j]=line_board[i+minw][j+minh];
}
}
for(int i=1;i<blocks;i++){
block_data[i][0][0]-=minw;
block_data[i][0][1]-=minh;
}
w=maxw-minw+1;
h=maxh-minh+1;
return;
}
int make_board(){
int cw=0,ch=0,maxx=0,maxy=0;
for(int i=1;i<=blocks;i++){
maxx=0;
maxy=0;
for(int j=1;j<=4;j++){
if(block_data[i][j][0]>maxx){
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){ 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(); init_mino();
put_mino(); put_mino();
line(); line();
for(int i=0;i<end;i++){
check_space=move2space();
if(check_space){
/*if(line()==0){
break;
}*/
}
check_line=move2line();
if(check_line){
if(line()==0){
break;
}
}
if(check_space==0 && check_line==0){
cout << "no more reshape" << endl;
}
//resize();
}
/*while(move2line()){
line();
limit++;
if(limit==end) break;
}*/
/* while(reshape()){
line();
limit++;
if(limit>=end) break;
}*/
//line();
resize();
return; return;
} }
...@@ -541,7 +1037,7 @@ void solver(void){ ...@@ -541,7 +1037,7 @@ void solver(void){
read_data(); read_data();
solve(); solve();
/* shape(); */ /* shape(); */
translate(); //translate();
return; return;
} }
No preview for this file type
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