數據結構課程設計迷宮問題
⑴ 高分求數據結構迷宮問題
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#define N 20
int aa[N][N];
int yes=0;
int x[100][2],n=0;
void fun1(int (*aa)[N],int (*a)[N]);
int fun(int (*a)[N],int i,int j);
void begain(int (*t)[N]);
void pr(int (*t)[N],int nn);
void win(int (*t)[N]);
void lose();
void main(void)
{
int t[N][N];
begain(t);
pr(t,0);
fun(t,1,1);
if(yes)
win(t);
else
lose();
getch();
}
void fun1(int (*aa)[N],int (*a)[N])
{
int i,j;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
aa[i][j]=a[i][j];
}
int fun(int (*a)[N],int i,int j)
{
if(i==N-2&&j==N-2)
{
yes=1;
return;
}
a[i][j]=1;
fun1(aa,a);
if(aa[i+1][j+1]==0&&!)
{
fun(aa,i+1,j+1);
if(yes)
{x[n][0]=i,x[n++][1]=j;return;}
}
fun1(aa,a);
if(aa[i+1][j]==0&&!yes)
{
fun(aa,i+1,j);
if(yes)
{x[n][0]=i,x[n++][1]=j;return;}
}
fun1(aa,a);
if(aa[i][j+1]==0&&!yes)
{
fun(aa,i,j+1);
if(yes)
{x[n][0]=i,x[n++][1]=j;return;}
}
fun1(aa,a);
if(aa[i-1][j]==0&&!yes)
{
fun(aa,i-1,j);
if(yes)
{x[n][0]=i,x[n++][1]=j;return;}
}
fun1(aa,a);
if(aa[i-1][j+1]==0&&!yes)
{
fun(aa,i-1,j+1);
if(yes)
{x[n][0]=i,x[n++][1]=j;return;}
}
fun1(aa,a);
if(aa[i+1][j-1]==0&&!yes)
{
fun(aa,i+1,j-1);
if(yes)
{x[n][0]=i,x[n++][1]=j;return;}
}
fun1(aa,a);
if(aa[i][j-1]==0&&!yes)
{
fun(aa,i,j-1);
if(yes)
{x[n][0]=i,x[n++][1]=j;return;}
}
fun1(aa,a);
if(aa[i-1][j-1]==0&&!yes)
{
fun(aa,i-1,j-1);
if(yes)
{x[n][0]=i,x[n++][1]=j;return;}
}
}
void begain(int (*t)[N])
{
int i,j;
system(cls);
randomize();
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(i==0||i==N-1||j==0||j==N-1)
t[i][j]=1;
else if(i==1&&j==1||i==N-2&&j==N-2)
t[i][j]=0;
else
t[i][j]=random(2);
}
}
}
void pr(int (*t)[N],int nn)
{
int i,j,ii;
textcolor(RED);
gotoxy(1,1);
for(i=0;i<N;i
⑵ 數據結構迷宮問題求解。
思路是鏈表存儲已走過的路徑(二級鏈表、struct、string等),存儲3個值表示除上一位置之外的三個回方向是否測試過,指針答a指向鏈表上當前位置,然後測試除上一位置之外的三個方向,並記錄。用do loop依次判斷,如果三個方向都不通 就將a退後一格然後讀取已檢索位置,並測試第一個未檢索位置。循環至終點或a退回起點並且沒有未檢索位置
⑶ 數據結構課程設計走迷宮怎麼遍歷所有路徑
深度優先與廣度優先
⑷ 數據結構 迷宮問題演算法
//迷宮求解(自定義一個2維矩陣作為地圖)
void Labyrinth()
{
printf("自定義迷宮矩陣:\n");
int a[10][10];
int i,j;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
scanf("%d",&a[i][j]);
printf("\n");
coordinate *Laby = new coordinate[100];
int n=1;
int x,y;
Laby[1].x=x=1;
Laby[1].y=y=6;
Laby[1].step=1;
a[1][6]=2;
SqStack S;
InitStack(S);
Push(S,0);
Push(S,1);
i=1;
while(GetTop(S))
{
if(a[x][y]==100)
{
printf("找到終點了!!!\n");
break;
}
i++;
if(n==1)
a[x][y]=i;
if(a[x][y-1]==1||a[x-1][y]==100)
{
Push(S,i);
Laby[i].x=x;
Laby[i].y=y=y-1;
Laby[i].step=i;
n=1;
continue;
}
else if(a[x-1][y]==1||a[x-1][y]==100)
{
Push(S,i);
Laby[i].x=x=x-1;
Laby[i].y=y;
Laby[i].step=i;
n=1;
continue;
}
else if(a[x][y+1]==1||a[x][y+1]==100)
{
Push(S,i);
Laby[i].x=x;
Laby[i].y=y=y+1;
Laby[i].step=i;
n=1;
continue;
}
else if(a[x+1][y]==1||a[x+1][y]==100)
{
Push(S,i);
Laby[i].x=x=x+1;
Laby[i].y=y;
Laby[i].step=i;
n=1;
continue;
}
else
{
Pop(S,i);
x=Laby[i].x;
y=Laby[i].y;
a[x][y]=-1;
n=0;
}
}
if(!GetTop(S))
printf("沒有找到出路!\n");
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
我沒有給出棧的代碼,你自己應該有吧!
具體迷宮演算法 就是如此 僅供參考
⑸ 數據結構課程設計的迷宮問題~~~~急!!!
看下我的程序,,要不是你要的.
#include <iostream>
#include <iomanip>
using namespace std;
#define M 20
#define N 20
struct move{int dx,dy;};
move mazemove[8];
char ma[M][N];
int False=0;
void maze()
{int i,j,num;
for(i=1;i<M-1;i++)
{for(j=1;j<N-1;j++)
{num=(800*(i+j)+1500)%327;
if((num<156)&&(i!=M||j!=N))
ma[i][j]='1';
else
ma[i][j]='0';
}
}
ma[1][1]='0';
ma[M-2][N-2]='0';
for(i=0;i<M;i++)
{for(j=0;j<N;j++)
cout<<setw(3)<<ma[i][j];
cout<<endl;
}
}
void inimove()
{mazemove[0].dx=0;mazemove[0].dy=1;
mazemove[1].dx=1;mazemove[1].dy=1;
mazemove[2].dx=1;mazemove[2].dy=0;
mazemove[3].dx=1;mazemove[3].dy=-1;
mazemove[4].dx=0;mazemove[4].dy=-1;
mazemove[5].dx=-1;mazemove[5].dy=-1;
mazemove[6].dx=-1;mazemove[6].dy=0;
mazemove[7].dx=-1;mazemove[7].dy=1;
}
void outpath()
{int i,j,x,y,k;
i=1;j=1;k=0;
while((i!=(M-2))||(j!=(N-2)))
{for(k=0;k<8;k++)
{x=i+mazemove[k].dx;
y=j+mazemove[k].dy;
if(ma[x][y]=='0'){k=0;break;}
}
if(k!=8)
{if(ma[i][j]=='8')ma[i][j]='2';
if(ma[i][j]=='0')ma[i][j]='>';
i=x;j=y;
}
else
{for(k=0;k<8;k++)
{x=i+mazemove[k].dx;
y=j+mazemove[k].dy;
if(ma[x][y]=='8')break;
}
ma[i][j]='2';
i=x;j=y;
}
if((i==1)&&(j==1))
{False=0;
break;
}
else False=1;
}
}
int main()
{int i,j;
maze();
inimove();
outpath();
cout<<endl;
if(False==0)
cout<<"無法走出該迷宮!"<<endl;
else
{cout<<"走出迷宮的路徑(用『>』符號表示)為:"<<endl;
ma[M-2][N-2]='>';
for(i=0;i<M;i++)
{for(j=0;j<N;j++)
{ {if(ma[i][j]=='2')ma[i][j]='>';
if(ma[i][j]=='0')ma[i][j]=' ';
if(ma[i][j]=='1')ma[i][j]='*';
}
cout<<setw(3)<<ma[i][j];
}
cout<<endl;
}
}
return 0;
}
⑹ 數據結構C語言版迷宮問題
剛學都這樣,想當初我學習的時候連一個單鏈表的逆置,都要理解半天。編程就是把實際問題給抽象成數學或非數學模型,結合數據的表示,再找到解決的方法。別忘了,學習數據結構是為了更好的操作數據。
思路:
首先,迷宮如何用計算機語言表示?一般用二維數組。0表示牆,1表示路。
其次,其次就是如何從迷宮中走出來了。結合堆棧,進行搜索。
你可以嘗試著對問題進行分層,然後逐步細化來解決。
如果你要解決一個別人給的走迷宮的問題,同樣還是要這樣,首先把別人給的迷宮在計算機中表示出來,其次結合數據結構所學的知識,找到通路,(關於結合數據結構的知識就看你自己的了,關鍵是對堆棧的了解)。
關於你說的,先看別人的程序,找到思路後自己才能編程問題。我看你是操之過急了,你得明白,知識的學習,首先就是會模仿,等你對整個課程有了系統的認識,你才會有自己的解題思路。創新是在有基礎的前提下進行的。別人的東西,試著理解,畢竟許多東西單憑我們自己是不太可能想出來的,就像kmp演算法一樣(你應該馬上就會學到)。
第一章說過,研究數據間的關系的目的是為了更好的操作數據,迷宮問題,可以說是一類「搜索」問題,更強調的是演算法,即在精通堆棧的基礎上想出一個利用堆棧對迷宮進行搜索的辦法。而堆棧,則是基礎,堆棧的操作就那麼幾個,學完馬上就會用。關鍵是如何運用三種程序設計方法再結合某些數據結構設計出一個演算法。一步一步來吧。
對了,給你一個問題考慮考慮,「不用任何輔助變數」編寫一個程序,逆置一個字元串試試。只給你一個參數:該參數就是指向字元串的指針。
你的最後問題問的就有點沒頭緒了,學習的過程並不是你想的那樣的,不見得數據結構學完之後就能編寫高質量程序,寫程序和看程序是相輔相成的,寫而不學則怠,學而不寫則罔。可以嘗試的寫寫,自己找不到思路可以看看別人是怎麼想的,自己多做做總結。
⑺ 數據結構程序設計(迷宮問題) - 百度文庫
看不到代碼啊
⑻ 數據結構的編程問題:迷宮問題.
直接
#include <stdio.h>
#define Limit_Size 500
int map[ Limit_Size ][ Limit_Size ];
int n, m;
int visit[ Limit_Size ][ Limit_Size ];
int success = 0, count;
struct road
{
int x, y;
};
road stack[ Limit_Size * Limit_Size ];
void init( )
{
int i, j;
char t[ Limit_Size ];
printf("Please input m and n:\n");
scanf("%d%d", &m, &n);
printf("Please input the map:\n");
for ( i = 1; i <= m; i++ )
{
scanf("%s", t);
for ( j = 1; j <= n; j++ )
{
visit[ i ][ j ] = 1;
map[ i ][ j ] = t[ j - 1 ] - '0';
}
}
for ( i = 0; i <= n + 1; i++ )
map[ 0 ][ i ] = map[ m + 1 ][ i ] = 1;
for ( i = 0; i <= m + 1; i++ )
map[ i ][ 0 ] = map[ i ][ n + 1 ] = 1;
visit[ 1 ][ 1 ] = 0;
}
void dfs( int x, int y, int step )
{
if ( success )
return ;
stack[ step ].x = x;
stack[ step ].y = y;
if ( x == n && y == n )
{
count = step;
success = 1;
return ;
}
if ( !map[ x - 1 ][ y ] && visit[ x - 1 ][ y ] )
{
visit[ x - 1 ][ y ] = 0;
dfs( x - 1, y, step + 1 );
visit[ x - 1 ][ y ] = 1;
}
if ( !map[ x + 1 ][ y ] && visit[ x + 1 ][ y ] )
{
visit[ x + 1 ][ y ] = 0;
dfs( x + 1, y, step + 1 );
visit[ x + 1 ][ y ] = 1;
}
if ( !map[ x ][ y - 1 ] && visit[ x ][ y - 1 ] )
{
visit[ x ][ y - 1 ] = 0;
dfs( x, y - 1, step + 1 );
visit[ x ][ y - 1 ] = 1;
}
if ( !map[ x ][ y + 1 ] && visit[ x ][ y + 1 ] )
{
visit[ x ][ y + 1 ] = 0;
dfs( x, y + 1, step + 1 );
visit[ x ][ y + 1 ] = 1;
}
}
void print( )
{
int i;
printf("(%d, %d)", stack[ 0 ].x, stack[ 0 ].y);
for ( i = 1; i <= count; i++ )
printf("->(%d, %d)", stack[ i ].x, stack[ i ].y);
printf("\n");
}
int main( )
{
init( );
dfs( 1, 1, 0 );
print( );
return 0;
}
⑼ 數據結構迷宮問題
自己慢慢看吧,,
#include <iostream>
#include <iomanip>
using namespace std;
#define M 20
#define N 20
struct move{int dx,dy;};
move mazemove[8];
char ma[M][N];
int False=0;
void maze()
{int i,j,num;
for(i=1;i<M-1;i++)
{for(j=1;j<N-1;j++)
{num=(800*(i+j)+1500)%327;
if((num<156)&&(i!=M||j!=N))
ma[i][j]='1';
else
ma[i][j]='0';
}
}
ma[1][1]='0';
ma[M-2][N-2]='0';
for(i=0;i<M;i++)
{for(j=0;j<N;j++)
cout<<setw(3)<<ma[i][j];
cout<<endl;
}
}
void inimove()
{mazemove[0].dx=0;mazemove[0].dy=1;
mazemove[1].dx=1;mazemove[1].dy=1;
mazemove[2].dx=1;mazemove[2].dy=0;
mazemove[3].dx=1;mazemove[3].dy=-1;
mazemove[4].dx=0;mazemove[4].dy=-1;
mazemove[5].dx=-1;mazemove[5].dy=-1;
mazemove[6].dx=-1;mazemove[6].dy=0;
mazemove[7].dx=-1;mazemove[7].dy=1;
}
void outpath()
{int i,j,x,y,k;
i=1;j=1;k=0;
while((i!=(M-2))||(j!=(N-2)))
{for(k=0;k<8;k++)
{x=i+mazemove[k].dx;
y=j+mazemove[k].dy;
if(ma[x][y]=='0'){k=0;break;}
}
if(k!=8)
{if(ma[i][j]=='8')ma[i][j]='2';
if(ma[i][j]=='0')ma[i][j]='>';
i=x;j=y;
}
else
{for(k=0;k<8;k++)
{x=i+mazemove[k].dx;
y=j+mazemove[k].dy;
if(ma[x][y]=='8')break;
}
ma[i][j]='2';
i=x;j=y;
}
if((i==1)&&(j==1))
{False=0;
break;
}
else False=1;
}
}
int main()
{int i,j;
maze();
inimove();
outpath();
cout<<endl;
if(False==0)
cout<<"無法走出該迷宮!"<<endl;
else
{cout<<"走出迷宮的路徑(用『>』符號表示)為:"<<endl;
ma[M-2][N-2]='>';
for(i=0;i<M;i++)
{for(j=0;j<N;j++)
{ {if(ma[i][j]=='2')ma[i][j]='>';
if(ma[i][j]=='0')ma[i][j]=' ';
if(ma[i][j]=='1')ma[i][j]='*';
}
cout<<setw(3)<<ma[i][j];
}
cout<<endl;
}
}
return 0;
}