...
 
Commits (8)
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++
CXXFLAGS = -O3 -DSOFTWARE
all: $(TARGET) o: main.o io.o solver.o
g++ -o solve main.o io.o solver.o
$(TARGET): $(OBJS) main.o: main.cpp
$(CXX) -o $@ $(OBJS) g++ -c main.cpp
clean: io.o: io.c
rm *.o g++ -c io.c
rm $(TARGET)
solver.o: solver.cpp
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)
makeで実行ファイルsolverができます.
MAKEFILE
g++ -o solve solver.cpp main.cpp io.c router/router.cpp -std=c++11
./solver < QUESTIONFILEで実行され解答のみを出力します.
必要ヘッダ
<limits.h>
<stdio.h>
<vector>
<algorithm>
"solver.h"
"io.h"
"router/router.hpp"
\ No newline at end of file
# 2019/08/26 追記
配線失敗時にボードを出力しないように変更しました
# 実行方法
```
cd nszw-solver
make
./solve < QUESTIONFILE
```
or
```
cd nszw-solver
g++ -o solve solver.cpp main.cpp io.c router/router.cpp -std=c++11
./solve < QUESTIONFILE
```
# 必要ヘッダ
* limits.h
* stdio.h
* vector
* algorithm
* "solver.h"
* "io.h"
* "router/router.hpp"
# 必要ファイル
* router/router.cpp
* io.c
* main.cpp
* solver.cpp
# 制約
* ブロックの横総数が72より小さい
* ブロックの縦総数が72より小さい
# アルゴリズム
* ブロックを縦,横に写像
* 写像をもとに配置,配線
* 配線に沿って縮小
* 空白を埋めるように縮小
* 解答
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,13 +2,16 @@ ...@@ -2,13 +2,16 @@
/* 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=20; if(solver()){
W=20; printf("success!");
solver();
print_answer(); print_answer();
}else{
printf("failed...");
}
return 0; return 0;
} }
......
...@@ -73,7 +73,7 @@ int router(short int size_x, short int size_y, short int line_num, short int boa ...@@ -73,7 +73,7 @@ int router(short int size_x, short int size_y, short int line_num, short int boa
lfsr_random_init(seed); lfsr_random_init(seed);
// Step 1 // Step 1
cout << "1st routing ..." << endl; //cout << "1st routing ..." << endl;
for(i = 0; i < line_num; i++) { for(i = 0; i < line_num; i++) {
if(adjacents[i]) continue; if(adjacents[i]) continue;
#ifdef PRINT_SEARCH #ifdef PRINT_SEARCH
...@@ -90,7 +90,7 @@ int router(short int size_x, short int size_y, short int line_num, short int boa ...@@ -90,7 +90,7 @@ int router(short int size_x, short int size_y, short int line_num, short int boa
ap_uint<1> overlap_checks[MAX_CELLS]; ap_uint<1> overlap_checks[MAX_CELLS];
// Step 2 // Step 2
cout << "rip-up routing ..." << endl; //cout << "rip-up routing ..." << endl;
short int last_target = -1; short int last_target = -1;
ap_uint<16> round; ap_uint<16> round;
for(round = 1; round <= ROUND_LIMIT; round++) { for(round = 1; round <= ROUND_LIMIT; round++) {
......
...@@ -11,8 +11,8 @@ ...@@ -11,8 +11,8 @@
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
#define MAX_LINES 256 #define MAX_LINES 256
......
No preview for this file type
...@@ -5,8 +5,10 @@ ...@@ -5,8 +5,10 @@
#include"solver.h" #include"solver.h"
#include"io.h" #include"io.h"
#include<stdio.h> #include<stdio.h>
#include <list> //#include <list>
#include <bits/stdc++.h> #include <vector>
#include <algorithm>
//#include <bits/stdc++.h>
#include "router/router.hpp" #include "router/router.hpp"
/* #include<stdlib.h> */ /* #include<stdlib.h> */
/* #include<string.h> */ /* #include<string.h> */
...@@ -21,6 +23,11 @@ short int board_beta[MAXSIZE][MAXSIZE]; //big board data ...@@ -21,6 +23,11 @@ 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];
short int success=0;
short int answerw=0,answerh=0;
vector <int> mino_order; vector <int> mino_order;
void reset_board(void){ void reset_board(void){
...@@ -35,15 +42,17 @@ void show_blocks(){ ...@@ -35,15 +42,17 @@ void show_blocks(){
int data[4][4]; int data[4][4];
int i,j,k; int i,j,k;
for(i=1;i<blocks;i++){ for(i=1;i<blocks;i++){
printf("block #%d\n",i); //printf("block #%d\n",i);
for(j=1;j<=4;j++){ for(j=1;j<=4;j++){
printf("x:%d y:%d edge:%d\n",block_data[i][j][0],block_data[i][j][1],block_data[i][j][2]); //printf("x:%d y:%d edge:%d\n",block_data[i][j][0],block_data[i][j][1],block_data[i][j][2]);
} }
} }
return; return;
} }
void read_data(void){ void read_data(void){
answerw=W;
answerh=H;
//show_blocks(); //show_blocks();
return; return;
} }
...@@ -76,7 +85,7 @@ void translate(void){ ...@@ -76,7 +85,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 +99,8 @@ void init_mino(void){ ...@@ -90,8 +99,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,54 +110,57 @@ void del_mino(int mino){ ...@@ -101,54 +110,57 @@ 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]>19){ if(x+block_data[i][j][0]>W-1){
return 0; return 0;
} }
if(y+block_data[i][j][1]>19){ 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(flag==0){
if(check_around(x+block_data[i][j][0],y+block_data[i][j][1])){ if(check_around(x+block_data[i][j][0],y+block_data[i][j][1])){
return 0; 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 << 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;
} }
} }
...@@ -167,26 +179,47 @@ void put_mino(){ ...@@ -167,26 +179,47 @@ void put_mino(){
int index=0; int index=0;
int next=0; int next=0;
int x=0; int x=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;
for(index=order_w.size()-1;index>=0;index--){ // find next block for(index=order_w.size()-1;index>=0;index--){ // find next block
if(done_block[order_w[index]]==0){ if(done_block[order_w[index]]==0){
next=order_w[index]; next=order_w[index];
another=1;
//done_block[next]=1; //done_block[next]=1;
//check_block[next]=1; //check_block[next]=1;
break; 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(index==-1) break; // if all blocks are searched
if(another){
itr=order_w.begin(); itr=order_w.begin();
for(int i=0;i<index;i++){//remove index itretor for(int i=0;i<index;i++){//remove index itretor
itr++; itr++;
} }
order_w.erase(itr); order_w.erase(itr);
std::cout << "block#"<<next << std::endl; }else{
itr=order_w.end();
}
//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];
...@@ -199,13 +232,13 @@ void put_mino(){ ...@@ -199,13 +232,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];
...@@ -230,10 +263,11 @@ void put_mino(){ ...@@ -230,10 +263,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;
...@@ -241,7 +275,7 @@ void put_mino(){ ...@@ -241,7 +275,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{
...@@ -266,23 +300,23 @@ void put_mino(){ ...@@ -266,23 +300,23 @@ 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");*/
printf("\n\nstart making order of height\n"); //printf("\n\nstart making order of height\n");
for(int i=1;i<=blocks;i++){//init status for(int i=1;i<=blocks;i++){//init status
check_block[i]=0; check_block[i]=0;
done_block[i]=0; done_block[i]=0;
...@@ -290,28 +324,44 @@ void put_mino(){ ...@@ -290,28 +324,44 @@ void put_mino(){
next=0; next=0;
itr=order_h.begin(); itr=order_h.begin();
order_h.push_back(1); order_h.push_back(1);
another=0;
while(true){//start of while true for height while(true){//start of while true for height
another=0;
for(index=order_h.size()-1;index>=0;index--){ // find next block for(index=order_h.size()-1;index>=0;index--){ // find next block
if(done_block[order_h[index]]==0){ if(done_block[order_h[index]]==0){
next=order_h[index]; 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; break;
} }
} }
if(index==0) break; // if all blocks are searched
}
//std::cout << "now" << std::endl; //std::cout << "now" << std::endl;
if(index==-1) break; // if all blocks are searched if(another==1){
itr=order_h.begin(); itr=order_h.begin();
for(int i=0;i<index;i++){//remove index itretor for(int i=0;i<index;i++){//remove index itretor
itr++; itr++;
} }
order_h.erase(itr); order_h.erase(itr);
std::cout << "block#"<<next << std::endl; }else{
itr=order_h.end();
}
/*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];
...@@ -324,13 +374,13 @@ void put_mino(){ ...@@ -324,13 +374,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];
...@@ -343,22 +393,23 @@ void put_mino(){ ...@@ -343,22 +393,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;
...@@ -366,7 +417,7 @@ void put_mino(){ ...@@ -366,7 +417,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{
...@@ -390,16 +441,17 @@ void put_mino(){ ...@@ -390,16 +441,17 @@ 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;
}//end of while ture for height }//end of while ture for height
printf("width is \n"); /*printf("width 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]);
} }
...@@ -410,119 +462,565 @@ void put_mino(){ ...@@ -410,119 +462,565 @@ void put_mino(){
printf("%d ",order_h[i]); printf("%d ",order_h[i]);
} }
printf("\n"); printf("\n");
*/
int put_block[100]; int put_block[100];
int hight_c=1,width_c=1; int height_c=0,width_c=1;
int next_put=1; int next_put=1;
int max_w=0;
int max_h=0;
for(int i=0;i<blocks;i++){ for(int i=0;i<blocks;i++){
hight_c=1; height_c=height_c+SPACE;
width_c=1; width_c=0;
if(i%2){ max_w=0;
max_h=0;
next_put = order_h[i];
for(int j=0;j<blocks;j++){ for(int j=0;j<blocks;j++){
if(put_block[order_w[j]]==0){ if(order_w[j]==next_put) break;
next_put=order_w[j]; max_w=0;
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];
}
}
//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;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];
}
}
}
int line(){
make_board_str(W,H);
//std::cout << lfsr <<std::endl;
int status = router(W, H, line_num, board_str);
fix_to_board(W,H);
if(status){
//std::cout << "success to line" << std::endl;
make_answer();
success=1;
}else{
//std::cout << "failed to line" << std::endl;
}
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; break;
} }
width_c++;
} }
for(int j=0;j<blocks;j++){ for(int i=1;i<=x;i++){
if(order_h[j]==next_put){ if(block_data[mino][0][0]-i<0) break;
if(check_move_mino(mino,-i,-move_y)){
move_x=i;
}else{
break; break;
} }
hight_c++;
} }
data_mino(next_put,width_c,hight_c); //std::cout << "mino " << mino << " can move " << move_x << " " << move_y << std::endl;
mino_order.push_back(next_put); 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{ }else{
for(int j=0;j<blocks;j++){ return 0;
if(put_block[order_h[j]]==0){ }
next_put=order_h[j]; }
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; break;
} }
hight_c++;
} }
for(int j=0;j<blocks;j++){ del_mino_line(mino);
if(order_w[j]==next_put){ 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; break;
} }
width_c++; 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;
} }
data_mino(next_put,width_c,hight_c); flag=1;
mino_order.push_back(next_put); //cout << "cannot move x" << endl;
//cout << i << " " << check_num << endl;
break;
}else{
//cout << "pass x" << endl;
} }
put_block[next_put]=1; 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)){
print_answer(); 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;
} }
//int next; line_board[mino_x+block_data[mino][check_num][0]-count][mino_y+block_data[mino][check_num][1]]=0;
int mino_x,mino_y; }
/*for(int i=0;i<blocks;i++){ if(flag) break;
next=mino_order[i]; new_x--;
mino_x=block_data[i][0][0]; line_board[mino_x+block_data[mino][check_num][0]-count][mino_y+block_data[mino][check_num][1]]=0;
mino_y=block_data[i][0][1]; //cout << "move left" << endl;
del_mino(next);
if(i%2){
for(int j=mino_x-1;j>1;j--){
if(check_put_mino(next,j,mino_y)){
mino_x=j;
}else{ }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; 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{ }else{
for(int j=mino_y-1;j>1;j--){ //cout << "pass" << endl;
if(check_put_mino(next,mino_x,j)){ }
mino_y=j; 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)){
}else{ flag=1;
//cout << "break" << endl;
break; 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;
} }
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++) { int move2line(){
for(int x = 0; x < size_x; x++) { vector< pair<int,int>> move_order;
int idx = y * size_x + x; int move=0,check_line=0,mino_dir,flag=0,check_num=0;
board_str[idx] = board_data[y][x]; //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;
} }
void fix_to_board(int size_x, int size_y){
for(int y = 0; y < size_y; y++) { int move2space(){
for(int x = 0; x < size_x; x++) { vector< pair<int,int>> move_order;
int idx = y * size_x + x; int move=0,check_line=0,mino_dir,flag=0;
board_data[y][x] = board_str[idx]; 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;
} }
void line(){ int reshape(){
make_board_str(20,20); vector< pair<int,int>> move_order;
std::cout << lfsr <<std::endl; int next,limit=0,end=5;
int status = router(20, 20, line_num, board_str); int flag=0;
if(status){ //std::cout << "start reshape" << std::endl;
std::cout << "success to line" << 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{ }else{
std::cout << "failed to line" << std::endl; break;
} }
fix_to_board(20,20); 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();
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(); line();
limit++;
if(limit>=end) break;
}*/
//line();
resize();
return; return;
} }
void solver(void){ int solver(void){
read_data(); read_data();
solve(); solve();
/* shape(); */ /* shape(); */
translate(); //translate();
return; if(w>answerw || h>answerh) success=0;
return success;
} }
...@@ -5,6 +5,6 @@ ...@@ -5,6 +5,6 @@
#define MAXSIZE 128 #define MAXSIZE 128
void solver(void); int solver(void);
#endif // _SOLVER_H_ #endif // _SOLVER_H_
No preview for this file type