迷宫课设——纯暴力输出

#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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DFS(深度优先搜索)可以用于解决迷宫出口问题。 首先,我们需要将迷宫转化为图,其中每个房间是图中的一个节点,每个房间之间的通道是图中的一条边。我们可以用一个二维数组来表示迷宫,其中0表示墙,1表示通道。 然后,我们可以使用DFS来搜索迷宫。我们从起点开始探索,每次选择一个未被访问的相邻节点进行探索,直到找到出口为止。为了避免陷入死循环,我们需要记录已经访问过的节点。 具体实现可以使用递归或者栈来实现DFS,以下是一个使用递归的示例代码(假起点为(0,0),出口为(n-1,m-1)): ```python def dfs(x, y, visited, maze): # 判断当前节点是否为出口 if x == len(maze)-1 and y == len(maze[0])-1: return True # 标记当前节点已被访问 visited[x][y] = True # 搜索相邻节点 for dx, dy in [(0,1), (0,-1), (1,0), (-1,0)]: nx, ny = x+dx, y+dy # 判断相邻节点是否合法 if 0 <= nx < len(maze) and 0 <= ny < len(maze[0]) and maze[nx][ny] == 1 and not visited[nx][ny]: # 递归搜索相邻节点 if dfs(nx, ny, visited, maze): return True return False # 测试 maze = [ [1, 0, 1, 1, 1], [1, 0, 1, 0, 1], [1, 0, 1, 0, 1], [1, 1, 1, 0, 1], [0, 0, 0, 0, 1] ] visited = [[False for _ in range(len(maze[0]))] for _ in range(len(maze))] print(dfs(0, 0, visited, maze)) # 输出True,表示存在从起点到出口的路径 ``` 这段代码中,dfs函数的参数分别表示当前搜索的节点坐标、已经访问过的节点、迷宫的二维数组。搜索过程中,我们先判断当前节点是否为出口,如果是,则返回True。然后标记当前节点已被访问,并搜索相邻节点,如果找到了一个相邻节点可以到达出口,则返回True。否则,返回False表示无法到达出口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值