Commit ceb02064 authored by royus's avatar royus

add comment

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