经典c程序(0036) ---迷宫求解(单条通路 栈实现)
2014-07-13 19:28
323 查看
/************************************************************************************** * Function : test * Create Date : 2014/07/13 * Author : NTSK13 * Email : beijiwei@qq.com * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性。 * 任何单位和个人不经本人允许不得用于商业用途 * Version : V0.1 *************************************************************************************** 经典c程序(0036) ---迷宫求解(单条通路 栈实现) 题目:较复杂迷宫求解 有多个分叉口,但只有一条路径 . 0为墙,1为通道 start (0,0) end (9,9) 入口: 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1 0 0 1 1 出口 **************************************************************************************/ #include<stdio.h> #define M 10 int data[M][M]; /***********************************************************/ typedef struct { int x; int y; int len; }Pos; Pos start,end; Pos cross_store[M*M]; int cross_increase; Pos path_store[M*M]; int path_increase; int len; /***********************************************************/ int offset[4][2]={-1,0,0,1,1,0,0,-1}; int mark[M][M]; int find(Pos start, Pos end); /***********************************************************/ int main(void) { int test_case; int T=0,th=0; /* The freopen function below opens input.txt file in read only mode, and afterward, the program will read from input.txt file instead of standard(keyboard) input. To test your program, you may save input data in input.txt file, and use freopen function to read from the file when using scanf function. You may remove the comment symbols(//) in the below statement and use it. But before submission, you must remove the freopen function or rewrite comment symbols(//). */ freopen("input.txt", "r", stdin); /* If you remove the statement below, your program's output may not be rocorded when your program is terminated after the time limit. For safety, please use setbuf(stdout, NULL); statement. */ setbuf(stdout, NULL); scanf("%d", &T); for(test_case = 0; test_case < T; test_case++) { int ret=0,i=0,j=0; /********************************** * Implement your algorithm here. */ scanf("%d", &th); for(i=0;i<M;i++) for(j=0;j<M;j++) { scanf("%d",&data[i][j]); mark[i][j]=0; } for(i=0;i<M*M;i++) { cross_store[i].x=-1; cross_store[i].y=-1; path_store[i].x=-1; path_store[i].y=-1; } cross_increase=0; path_increase=0; len=0; start.x=0; start.y=0; end.x=9; end.y=9; ret=find(start,end); /*************************************/ // Print the answer to standard output(screen). printf("#%d %d\n",th,ret); fflush(stdout);//修复Eclipse printf()不能显示的小bug i=0; while(path_store[i].x !=-1) { printf("The %dth stp is (%d,%d) \n",i+1,path_store[i].x,path_store[i].y); fflush(stdout);//修复Eclipse printf()不能显示的小bug i++; } } return (0);//Your program should return 0 on normal termination. } int find(Pos start, Pos end) { int x=0,y=0,tx=0,ty=0,k=0,flag=0; x=start.x; y=start.y; while(1) { path_store[path_increase].x=x; path_store[path_increase].y=y; path_store[path_increase].len=len++; path_increase++; mark[x][y]=1; if(x==end.x && y==end.y)//找到 return (1); flag=0; for(k=0;k<4;k++)// check cross { tx=x+offset[k][0]; ty=y+offset[k][1]; if( tx>=0 && tx<M && ty>=0 && ty<M && mark[tx][ty]==0 ) { if(data[tx][ty]==1) flag++; } } if(flag==0)//no path; return last cross { x=cross_store[cross_increase-1].x; y=cross_store[cross_increase-1].y; len=cross_store[cross_increase-1].len; path_increase=len; } if(flag>1)// encounter cross ,store { cross_store[cross_increase].x=x; cross_store[cross_increase].y=y; cross_store[cross_increase].len= len; cross_increase++; } for(k=0;k<4;k++)// go { tx=x+offset[k][0]; ty=y+offset[k][1]; if( tx>=0 && tx<M && ty>=0 && ty<M && mark[tx][ty]==0 ) { if(data[tx][ty]==1) { x=tx; y=ty; //continue; break; } } } } }
相关文章推荐
- 经典c程序(0035) ---迷宫求解(单条通路 类栈实现)
- 经典c程序(0033) ---迷宫通路求解(单条通路DFS)
- 经典c程序(0034) ---迷宫通路求解(多条通路DFS)
- 【数据结构实验】编制一个程序求解迷宫通路
- 经典算法<一>迷宫问题 1.单条路径 DFS求解 C++实现
- 利用栈实现简单的求解迷宫程序
- 经典算法<一>迷宫问题 2.单条路径 BFS求解 C++实现
- 程序实现搜索迷宫出口完整版
- 实现迷宫问题的所有路径及最短路径程序
- 数据结构和算法设计(迷宫求解问题的栈和队列的实现)
- 用栈和队列实现迷宫求解
- 迷宫求解:严蔚敏老师的数据结构的实现
- 利用栈实现迷宫的求解
- 栈实现迷宫的较完善 程序
- 用C语言实现迷宫求解问题
- 广度遍历实现迷宫求解
- 用递归实现求一个迷宫是否有通路
- 杯子倒水问题自动求解程序(Javascript实现)
- 数据结构的应用——使用栈实现任意迷宫的求解
- 分享一个C#实现的迷宫生成程序,继续演示LINQ语法在C#中的运用