Commit a6a84d6f authored by royus's avatar royus

changed algorythm (unfinished)

parent 51ae9171
/* 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];
......@@ -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;
}
......@@ -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;
}
......@@ -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;
}
void solve(void){
int i;
for(i=1;i<=lines;i++)
connect(i);
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;
}
}
}
return 0;
}
void write(void){
......@@ -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;
}
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