#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
//#define N 10
//#define M N+2
//void short(char *migong,int *flag){
// int trail[100];
// int head,rear;
// head = 0;
// rear = 0;
// i
//}
void loading(void){
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf(" _ _ ___________ __ ________ _____________ _ __ ___________ \n");
printf(" \\\\ /\\\ // | ________| || |_______| | _______ | / \\ / \ \\ | ________| \n");
printf(" \\\\ //\\\\ // ||________ || || | | | | / /\\\\ / /\\ \\ ||________ \n");
printf(" \\\\ // \\\\ // |_________| || || | | | | / / \\\\ / / \\ \\ |_________| \n");
printf(" \\\\_// \\\\_// ||________ ||______ ||______ | |______| | / / \\\\/ / \\ \\ ||________ \n");
printf(" \\_/ \\_/ |_________| |_______| |_______| |___________| /_/ \\_/ \\_\\ |_________| \n");
}
int main(void){
//读取文件中迷宫的内容
loading();
Sleep(1000);
system("cls");
FILE *in;
FILE *out;
int way[100];
printf(" _____________________\n");
printf("| |\n");
printf("| 请输入迷宫的大小: |\n");
printf("|_____________________|\n");
printf("\n");
printf("-->>");
int N,M;
scanf("%d",&N);
M = N+2;
int top = 0;
char migong[M][M-1];
int flag[M][M];//记录迷宫中的每一步的方向
if((in=fopen("in.in","r"))==NULL){
printf("can't find the file in");
exit(0);
}
//把迷宫的最外层统一设置为墙
for(int i = 0;i<M;i++){
for(int j = 0;j<M;j++){
if(i==0||j==0||i==N+1||j==N+1){
migong[i][j] = '1';
}
}
}
//把记录数组的方向统一置为0
for(int i = 0;i<M;i++){
for(int j = 0;j<M;j++){
flag[i][j] = 0;
}
}
//从文件中读取迷宫的内容
char ch = fgetc(in);
int i = 1;
int j = 1;
while(i<N+1){
migong[i][j] = ch;
j++;
if(j == N+1){
i++;
j = 1;
}
ch = fgetc(in);
if(ch=='\n'){
ch = fgetc(in);
}
}
//关闭文件
fclose(in);
//打印迷宫的内容
for(int i = 0;i<M;i++){
for(int j = 0;j<M;j++){
printf("%c",migong[i][j]);
}
printf("\n");
}
//打开文件
if((out=fopen("out.out","w"))==NULL){
printf("can't find the file out");
exit(0);
}
i = 1;
j = 1;
//开始走迷宫,位于(1,1)的位置,终点位于(N,N),走迷宫的次序是,右下左上
while(!(i==N&&j==N)){
//如果右边的是可以走的,那么把当前位置设置当前位置的右边,把当前路径设置为走过的路径
printf(" now:i:%d,j:%d,%c\n",i,j,migong[i][j]);
printf("right:i:%d,j:%d,%c\n",i,j+1,migong[i][j+1]);
printf(" down:i:%d,j:%d,%c\n",i+1,j,migong[i+1][j]);
printf(" left:i:%d,j:%d,%c\n",i,j-1,migong[i][j-1]);
printf(" up:i:%d,j:%d,%c\n",i-1,j,migong[i-1][j]);
if(migong[i][j+1]!='1'&&flag[i][j]<1){
flag[i][j]=1;//1代表当前方向的下一个方向是右边
top++;
way[top] = flag[i][j];//把来时的方向存入栈中
j++;//向右走了一步
}else if(migong[i+1][j]!='1'&&flag[i][j]<2){
//如果下边的是可以走的,那么把当前位置设置当前位置的下边,把当前路径设置为走过的路径
flag[i][j]=2;
top++;
way[top] = flag[i][j];//把来时的方向存入栈中
i++;
}else if(migong[i][j-1]!='1'&&flag[i][j]<3){
//如果左边的是可以走的,那么把当前位置设置当前位置的左边,把当前路径设置为走过的路径
flag[i][j]=3;
top++;
way[top] = flag[i][j];//把来时的方向存入栈中
j--;
}else if(migong[i-1][j]!='1'&&flag[i][j]<4){
//如果上边的是可以走的,那么把当前位置设置当前位置的上边,把当前路径设置为走过的路径
flag[i][j]=4;
top++;
way[top] = flag[i][j];//把来时的方向存入栈中
i--;
}else{
if(way[top]==1){
j--;
}else if(way[top]==2){
i--;
}else if(way[top]==3){
j++;
}else{
i++;
}
top--;
}
}
//把方向图写到out文件中
for(int i = 0;i<M;i++){
for(int j = 0;j<M;j++){
fprintf(out,"%d",flag[i][j]);
}
fprintf(out,"\n");
}
//关闭文件
fclose(out);
return 0;
}