Loading source/solver.c +82 −52 Changes for source/solver.c: 82 added lines, 52 removed lines. Original line number Diff line number Diff line /* solver.c */ /* Last Change: 2018/07/16 (Mon) 10:05:50. */ /* Last Change: 2018/08/26 (Sun) 05:04:28. */ #define MAX_ATTEMPS lines*10 #include<stdio.h> /* #include<stdlib.h> */ #include<stdlib.h> #include<string.h> /* #include<limits.h> */ /* #include<math.h> */ /* #include<time.h> */ #include<time.h> int board[8][72][72]={}; int avail[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 depth,height,width; int lines; int searchorder[6]; //z,y,x void reset(void){ int i,j,k; for(i=0;i<depth;i++) for(j=0;j<height;j++) for(k=0;k<width;k++) board[i][j][k]=0; return; } void read(void){ int x,y,z,i; char c,str[8]; Loading Loading @@ -78,35 +73,48 @@ void read(void){ return; } int order(int num){ //1-lines -> 1-lines return num; int randline(void){ //1-lines -> 1-lines return rand()%lines+1; } int connected(int line){ int i,j,k; for(i=0;i<depth;i++) for(j=0;j<height;j++) for(k=0;k<width;k++) if(board[i][j][k]==line) return 1; return 0; void shuffle(int array[]){ for(int i=0;i<6;i++){ int j=rand()%6; int t=array[i]; array[i]=array[j]; array[j]=t; } } int available(int startx,int starty, int startz){ if(avail[startz][starty][startx]==-1) if(avail[startz][starty][startx]==-1) //goal return 1; if(avail[startz][starty][startx]==2) //visited return 0; avail[startz][starty][startx]=2; shuffle(searchorder); int i; for(i=0;i<6;i++) switch(searchorder[i]){ case 0: if(startx>0&&available(startx-1,starty,startz)) return 1; case 1: if(starty>0&&available(startx,starty-1,startz)) return 1; case 2: if(startz>0&&available(startx,starty,startz-1)) return 1; case 3: if(startx<depth&&available(startx+1,starty,startz)) return 1; case 4: if(starty<height&&available(startx,starty+1,startz)) return 1; case 5: if(startz<width&&available(startx,starty,startz+1)) return 1; } return 0; } Loading @@ -116,28 +124,35 @@ int connectable(int linea,int lineb){ for(i=0;i<depth;i++) for(j=0;j<height;j++) for(k=0;k<width;k++) if(board[i][j][k]==-linea) if(board[i][j][k]==-linea){ if(notfound){ notfound=0; avail[i][j][k]=1; startz=i; starty=j; startx=k; }else avail[i][j][k]=-1; else if(board[i][j][k]==0||board[i][j][k]==lineb||board[i][j][k]==linea) avail[startz][starty][startx]=3; }else{ avail[i][j][k]=-1; //goal } }else if(board[i][j][k]==0||board[i][j][k]==lineb||board[i][j][k]==linea){ avail[i][j][k]=1; else }else{ avail[i][j][k]=0; } if(startx==-1||starty==-1||startz==-1){ printf("Error!\n"); printf("Error: Line %d\n",linea); return 0; } return available(startx,starty,startz); } void actuallyconnect(int num){ //REQUIRED void connect(int num){ 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]=num; return; } Loading @@ -151,25 +166,35 @@ void delete(int line){ return; } void connect(int num){ int i; if(connectable(order(num),0)) actuallyconnect(order(num)); else for(i=num-1;i>=1;i--) if(connectable(order(num),order(i))){ delete(order(i)); actuallyconnect(order(num)); connect(i); int solve(void){ //return 1 when solved, 0 when cannot int i,j,linea,lineb; for(i=0;i<MAX_ATTEMPS;i++){ linea=randline(); if(connected[linea]) continue; if(connectable(linea,0)){ connect(linea); connected[linea]=1; connected[0]++; if(connected[0]==lines) return 1; } return; else{ for(j=0;j<lines*2;j++){ lineb=randline(); if(connectable(linea,lineb)){ delete(lineb); connect(linea); connected[linea]=1; connected[lineb]=0; break; } if(j==MAX_ATTEMPS/2-1) return 0; } void solve(void){ int i; for(i=1;i<=lines;i++) connect(i); return; } } return 0; } void write(void){ Loading @@ -193,10 +218,15 @@ void write(void){ } int main(void){ /* reset(); */ int i; srand((unsigned)time(NULL)); read(); solve(); for(i=0;i<6;i++) searchorder[i]=i; if(solve()) write(); else printf("Cannot solve!\n"); return 0; } source/tags.lock 0 → 100644 +0 −0 Empty file added. Loading
source/solver.c +82 −52 Changes for source/solver.c: 82 added lines, 52 removed lines. Original line number Diff line number Diff line /* solver.c */ /* Last Change: 2018/07/16 (Mon) 10:05:50. */ /* Last Change: 2018/08/26 (Sun) 05:04:28. */ #define MAX_ATTEMPS lines*10 #include<stdio.h> /* #include<stdlib.h> */ #include<stdlib.h> #include<string.h> /* #include<limits.h> */ /* #include<math.h> */ /* #include<time.h> */ #include<time.h> int board[8][72][72]={}; int avail[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 depth,height,width; int lines; int searchorder[6]; //z,y,x void reset(void){ int i,j,k; for(i=0;i<depth;i++) for(j=0;j<height;j++) for(k=0;k<width;k++) board[i][j][k]=0; return; } void read(void){ int x,y,z,i; char c,str[8]; Loading Loading @@ -78,35 +73,48 @@ void read(void){ return; } int order(int num){ //1-lines -> 1-lines return num; int randline(void){ //1-lines -> 1-lines return rand()%lines+1; } int connected(int line){ int i,j,k; for(i=0;i<depth;i++) for(j=0;j<height;j++) for(k=0;k<width;k++) if(board[i][j][k]==line) return 1; return 0; void shuffle(int array[]){ for(int i=0;i<6;i++){ int j=rand()%6; int t=array[i]; array[i]=array[j]; array[j]=t; } } int available(int startx,int starty, int startz){ if(avail[startz][starty][startx]==-1) if(avail[startz][starty][startx]==-1) //goal return 1; if(avail[startz][starty][startx]==2) //visited return 0; avail[startz][starty][startx]=2; shuffle(searchorder); int i; for(i=0;i<6;i++) switch(searchorder[i]){ case 0: if(startx>0&&available(startx-1,starty,startz)) return 1; case 1: if(starty>0&&available(startx,starty-1,startz)) return 1; case 2: if(startz>0&&available(startx,starty,startz-1)) return 1; case 3: if(startx<depth&&available(startx+1,starty,startz)) return 1; case 4: if(starty<height&&available(startx,starty+1,startz)) return 1; case 5: if(startz<width&&available(startx,starty,startz+1)) return 1; } return 0; } Loading @@ -116,28 +124,35 @@ int connectable(int linea,int lineb){ for(i=0;i<depth;i++) for(j=0;j<height;j++) for(k=0;k<width;k++) if(board[i][j][k]==-linea) if(board[i][j][k]==-linea){ if(notfound){ notfound=0; avail[i][j][k]=1; startz=i; starty=j; startx=k; }else avail[i][j][k]=-1; else if(board[i][j][k]==0||board[i][j][k]==lineb||board[i][j][k]==linea) avail[startz][starty][startx]=3; }else{ avail[i][j][k]=-1; //goal } }else if(board[i][j][k]==0||board[i][j][k]==lineb||board[i][j][k]==linea){ avail[i][j][k]=1; else }else{ avail[i][j][k]=0; } if(startx==-1||starty==-1||startz==-1){ printf("Error!\n"); printf("Error: Line %d\n",linea); return 0; } return available(startx,starty,startz); } void actuallyconnect(int num){ //REQUIRED void connect(int num){ 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]=num; return; } Loading @@ -151,25 +166,35 @@ void delete(int line){ return; } void connect(int num){ int i; if(connectable(order(num),0)) actuallyconnect(order(num)); else for(i=num-1;i>=1;i--) if(connectable(order(num),order(i))){ delete(order(i)); actuallyconnect(order(num)); connect(i); int solve(void){ //return 1 when solved, 0 when cannot int i,j,linea,lineb; for(i=0;i<MAX_ATTEMPS;i++){ linea=randline(); if(connected[linea]) continue; if(connectable(linea,0)){ connect(linea); connected[linea]=1; connected[0]++; if(connected[0]==lines) return 1; } return; else{ for(j=0;j<lines*2;j++){ lineb=randline(); if(connectable(linea,lineb)){ delete(lineb); connect(linea); connected[linea]=1; connected[lineb]=0; break; } if(j==MAX_ATTEMPS/2-1) return 0; } void solve(void){ int i; for(i=1;i<=lines;i++) connect(i); return; } } return 0; } void write(void){ Loading @@ -193,10 +218,15 @@ void write(void){ } int main(void){ /* reset(); */ int i; srand((unsigned)time(NULL)); read(); solve(); for(i=0;i<6;i++) searchorder[i]=i; if(solve()) write(); else printf("Cannot solve!\n"); return 0; }