Commit a6a84d6f authored by royus's avatar royus
Browse files

changed algorythm (unfinished)

parent 51ae9171
Loading
Loading
Loading
Loading
+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];
@@ -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;
		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){
@@ -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.