Loading source/solver.c +15 −14 Changes for source/solver.c: 15 added lines, 14 removed lines. Original line number Diff line number Diff line /* solver.c */ /* Last Change: 2018/08/26 (Sun) 05:44:44. */ /* Last Change: 2018/08/26 (Sun) 14:46:21. */ #define MAX_ATTEMPS 1000000 Loading @@ -12,13 +12,13 @@ int board[8][72][72]={}; int avail[8][72][72]={}; //start=3,path=2,avail=1,nonavail=0,goal=-1 int connected[8*72*72/2+1]={}; int connected[8*72*72/2+1]={}; //connected[0]=(number of connected lines) int depth,height,width; int lines; int searchorder[6]; int searchorder[6]; //x+-,y+-,z+- //z,y,x void read(void){ void read(void){ //read problem int x,y,z,i; char c,str[8]; scanf(" %s",str); //SIZE Loading Loading @@ -73,11 +73,11 @@ void read(void){ return; } int randline(void){ //1-lines -> 1-lines int randline(void){ //return random line number return rand()%lines+1; } int available(int startx,int starty, int startz){ int available(int startx,int starty, int startz){ //return 1 when (startx,starty,startz) can be connected to goal if(avail[startz][starty][startx]==-1) //goal return 1; if(avail[startz][starty][startx]==2||avail[startz][starty][startx]==3) //visited Loading Loading @@ -114,7 +114,7 @@ int available(int startx,int starty, int startz){ return 0; } int connectable(int linea,int lineb){ int connectable(int linea,int lineb){ //return 1 if linea canbe connected when lineb is deleted int startx=-1,starty=-1,startz=-1,notfound=1; int i,j,k; for(i=0;i<depth;i++) Loading @@ -129,30 +129,31 @@ int connectable(int linea,int lineb){ avail[startz][starty][startx]=3; }else{ avail[i][j][k]=-1; //goal notfound=2; } }else if(board[i][j][k]==0||board[i][j][k]==lineb||board[i][j][k]==linea){ avail[i][j][k]=1; }else{ avail[i][j][k]=0; } if(startx==-1||starty==-1||startz==-1){ if(startx==-1||starty==-1||startz==-1||notfound!=2){ printf("Error: Line %d\n",linea); return 0; } return available(startx,starty,startz); } void connect(int num){ void connect(int line){ //connect line int i,j,k; for(i=0;i<depth;i++) for(j=0;j<height;j++) for(k=0;k<width;k++) if(avail[i][j][k]==2&&board[i][j][k]==0) board[i][j][k]=num; board[i][j][k]=line; return; } void delete(int line){ void delete(int line){ //delete line int i,j,k; for(i=0;i<depth;i++) for(j=0;j<height;j++) Loading @@ -164,11 +165,11 @@ void delete(int line){ int solve(void){ //return 1 when solved, 0 when cannot int i,j,linea,lineb; for(i=0;i<MAX_ATTEMPS;i++){ for(i=0;i<MAX_ATTEMPS;i++){ //try to connect MAX_ATTEMPS times linea=randline(); if(connected[linea]) continue; if(connectable(linea,0)){ if(connectable(linea,0)){ //if linea canbe conneced without deleting lines connect(linea); connected[linea]=1; connected[0]++; Loading @@ -176,7 +177,7 @@ int solve(void){ //return 1 when solved, 0 when cannot return 1; } else{ for(j=0;j<MAX_ATTEMPS;j++){ for(j=0;j<MAX_ATTEMPS;j++){ //try to find a line to delete lineb=randline(); if(connectable(linea,lineb)){ delete(lineb); Loading Loading
source/solver.c +15 −14 Changes for source/solver.c: 15 added lines, 14 removed lines. Original line number Diff line number Diff line /* solver.c */ /* Last Change: 2018/08/26 (Sun) 05:44:44. */ /* Last Change: 2018/08/26 (Sun) 14:46:21. */ #define MAX_ATTEMPS 1000000 Loading @@ -12,13 +12,13 @@ int board[8][72][72]={}; int avail[8][72][72]={}; //start=3,path=2,avail=1,nonavail=0,goal=-1 int connected[8*72*72/2+1]={}; int connected[8*72*72/2+1]={}; //connected[0]=(number of connected lines) int depth,height,width; int lines; int searchorder[6]; int searchorder[6]; //x+-,y+-,z+- //z,y,x void read(void){ void read(void){ //read problem int x,y,z,i; char c,str[8]; scanf(" %s",str); //SIZE Loading Loading @@ -73,11 +73,11 @@ void read(void){ return; } int randline(void){ //1-lines -> 1-lines int randline(void){ //return random line number return rand()%lines+1; } int available(int startx,int starty, int startz){ int available(int startx,int starty, int startz){ //return 1 when (startx,starty,startz) can be connected to goal if(avail[startz][starty][startx]==-1) //goal return 1; if(avail[startz][starty][startx]==2||avail[startz][starty][startx]==3) //visited Loading Loading @@ -114,7 +114,7 @@ int available(int startx,int starty, int startz){ return 0; } int connectable(int linea,int lineb){ int connectable(int linea,int lineb){ //return 1 if linea canbe connected when lineb is deleted int startx=-1,starty=-1,startz=-1,notfound=1; int i,j,k; for(i=0;i<depth;i++) Loading @@ -129,30 +129,31 @@ int connectable(int linea,int lineb){ avail[startz][starty][startx]=3; }else{ avail[i][j][k]=-1; //goal notfound=2; } }else if(board[i][j][k]==0||board[i][j][k]==lineb||board[i][j][k]==linea){ avail[i][j][k]=1; }else{ avail[i][j][k]=0; } if(startx==-1||starty==-1||startz==-1){ if(startx==-1||starty==-1||startz==-1||notfound!=2){ printf("Error: Line %d\n",linea); return 0; } return available(startx,starty,startz); } void connect(int num){ void connect(int line){ //connect line int i,j,k; for(i=0;i<depth;i++) for(j=0;j<height;j++) for(k=0;k<width;k++) if(avail[i][j][k]==2&&board[i][j][k]==0) board[i][j][k]=num; board[i][j][k]=line; return; } void delete(int line){ void delete(int line){ //delete line int i,j,k; for(i=0;i<depth;i++) for(j=0;j<height;j++) Loading @@ -164,11 +165,11 @@ void delete(int line){ int solve(void){ //return 1 when solved, 0 when cannot int i,j,linea,lineb; for(i=0;i<MAX_ATTEMPS;i++){ for(i=0;i<MAX_ATTEMPS;i++){ //try to connect MAX_ATTEMPS times linea=randline(); if(connected[linea]) continue; if(connectable(linea,0)){ if(connectable(linea,0)){ //if linea canbe conneced without deleting lines connect(linea); connected[linea]=1; connected[0]++; Loading @@ -176,7 +177,7 @@ int solve(void){ //return 1 when solved, 0 when cannot return 1; } else{ for(j=0;j<MAX_ATTEMPS;j++){ for(j=0;j<MAX_ATTEMPS;j++){ //try to find a line to delete lineb=randline(); if(connectable(linea,lineb)){ delete(lineb); Loading