1. 程式人生 > >實驗周代碼(迷宮+完全二叉樹儲存結構轉換)

實驗周代碼(迷宮+完全二叉樹儲存結構轉換)

題目4:迷宮問題 具體設計要求: 將迷宮的左上角作為入口,右下角作為出口,對任意設定的迷宮,求出一條從入口到出口的通道,或得出沒有通路的結論。 (1)若從入口到出口的通道存在請顯示相應路徑,要求介面友好。 (2)要求資訊能保存於文字檔案中。

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<fstream>
#include<time.h>
#include<stack>
#include<queue>
#include <conio.h>
#include <malloc.h> #include <ctype.h> #include <windows.h> #define maxn 100 using namespace std; typedef struct Node{ //定義每個結點的結構體 int x,y,steps; }node; char mp[100][100]; //儲存固定地圖 char mp1[100][100]; //保留隨機地圖 char mp2[100][100]; //保留自定義地圖 int dir[4][2]={-1,0,1,0,0,1,0,-1}; node pre[
100][100]; //儲存先前結點的資訊 int STEP=0; //統計走的步數 int flag=0; //標記能否成功到達終點 void print(){ for(int i=0;i<20;i++){ for(int j=0;j<20;j++){ cout<<mp[i][j]<<" "; } cout<<endl; } } int menue_select(){ int c; do{ system
("cls"); //清屏 cout<<"\t"<<"歡迎進入迷宮遊戲"<<endl; cout<<"\t"<<"-----------------"<<endl; cout<<"\t"<<"1.固定模式地圖"<<endl; cout<<"\t"<<"2.隨機模式地圖"<<endl; cout<<"\t"<<"3.自定義模式地圖"<<endl; cout<<"\t"<<"4.退出"<<endl; cout<<"\t"<<"-----------------"<<endl; cout<<"\t"<<"請對應所需選項1-4"<<"\t"<<endl; cin>>c; if(c<1||c>4){ cout<<"您輸入的資訊有誤,請再次輸入."<<endl; system("pause"); } }while(c<1||c>4); return c; } void exitt(){ char c; cout<<"\t"<<"你確定退出系統嗎? y/n"<<"\t"; getchar(); cin>>c; if(c=='y'||c=='Y') { cout<<"系統已經退出"<<endl; system("pause"); exit(0); if(c=='n'||c=='N') { cout<<"即將返回介面"<<endl; system("pause"); } } } void init(char a[100][100]){ for(int i=0;i<100;i++){ for(int j=0;j<100;j++){ a[i][j]=' '; } } } void read_map1(char mp[100][100]){ FILE* fp=fopen("map.txt","r"); if(fp==NULL){ cout<<"ERROR!"<<endl; return ; } int b[100][100]; for(int i=0;i<9;i++){ for(int j=0;j<12;j++){ fscanf(fp,"%d",&b[i][j]); } fscanf(fp,"\n"); } for(int i=0;i<9;i++){ for(int j=0;j<12;j++){ if(b[i][j]==1){ mp[i][j]='#'; } else{ mp[i][j]='.'; } } } fclose(fp); mp[8][11]='E'; mp[0][0]='S'; } int check(node s,char a[100][100],int m,int n){ if(s.x<0||s.y<0||s.x>m-1||s.y>n-1) return 0; if(a[s.x][s.y]=='#') return 0; return 1; } void bfs(int &STEP,char a[100][100],int m,int n){ queue<node> que; int vis[100][100]; node sta,edd; //起點和終點 sta.x=0; sta.y=0; sta.steps=0; edd.x=m-1; edd.y=n-1; edd.steps=0; memset(vis,0,sizeof(vis)); que.push(sta); while(!que.empty()){ node p=que.front(); que.pop(); if(p.x==edd.x&&p.y==edd.y){ STEP=p.steps; flag=1; break; } for(int i=0;i<4;i++){ node tmp; tmp.x=p.x+dir[i][0]; tmp.y=p.y+dir[i][1]; if(check(tmp,a,m,n)&&vis[tmp.x][tmp.y]==0){ vis[tmp.x][tmp.y]=1; tmp.steps=p.steps+1; pre[tmp.x][tmp.y]=p; que.push(tmp); } } } } void show_map(char a[100][100],int m,int n){ for(int i=0;i<m;i++){ cout<<" "; for(int j=0;j<n;j++){ if(a[i][j]=='*'){ cout<<a[i][j]; } else{ cout<<a[i][j]; } } cout<<endl; } Sleep(1000); cout << endl; } void print_route(int STEP,char a[100][100],int m,int n){ system("cls"); node t; t.x=m-1; t.y=n-1; stack<node> ss; while(STEP--){ t=pre[t.x][t.y]; ss.push(t); } while(!ss.empty()){ t=ss.top(); ss.pop(); a[t.x][t.y]='P'; show_map(a,m,n); Sleep(300); system("cls"); a[t.x][t.y]='+'; } cout<<endl; cout<<"\t"<<"恭喜你,成功到達終點!"<<endl<<endl; getchar(); } void run_map1(){ int m=9,n=12; init(mp); //初始化地圖為空白 read_map1(mp); //從文字中讀入固定的地圖 cout<<"\t"<<"歡迎使用固定地圖"<<endl; cout<<"請輸入任意字元開始遊戲"<<endl; getchar(); getchar(); STEP=0; bfs(STEP,mp,m,n); if(!flag){ cout<<"不存在從起點到終點的路徑。"<<endl; return ; } cout<<"\t"<<"最短路徑搜素成功!"<<endl; print_route(STEP,mp,m,n); } void rand_mp1(char mp1[100][100],int m,int n){ srand((unsigned)time(NULL)); int tmp; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ tmp=(rand()%10); if(tmp<5){ mp1[i][j]='.'; } else{ mp1[i][j]='#'; } } } mp1[0][0]='S'; mp1[m-1][n-1]='E'; } void run_map2(){ int m,n; init(mp1); cout<<"\t"<<"歡迎使用隨機地圖"<<endl; cout<<"請您輸入地圖的長和寬(長度和寬度均小於100)"<<endl; cin>>m>>n; rand_mp1(mp1,m,n); //隨機生成mp1 show_map(mp1,m,n); //顯示地圖 STEP=0; bfs(STEP,mp1,m,n); if(!flag){ cout<<"不存在從起點到終點的路徑。"<<endl; return ; } cout<<"\t"<<"最短路徑搜素成功!"<<endl; cout << "下面輸出到達路徑。" << endl; print_route(STEP,mp1,m,n); } void run_map3(){ int m,n; int x; init(mp2); cout<<"\t"<<"歡迎使用自定義地圖"<<endl; cout<<"請您輸入地圖的長和寬(長度和寬度均小於100)"<<endl; cin>>m>>n; cout<<"請您輸入地圖的形狀(0代表暢通,1代表阻礙,中間用空格間隔)"<<endl; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ cin>>x; if(x==0){ mp2[i][j]='.'; } else{ mp2[i][j]='#'; } } } //show_map(mp2,m,n); //顯示地圖 STEP=0; bfs(STEP,mp2,m,n); if(!flag){ cout<<"不存在從起點到終點的路徑。"<<endl; return ; } cout<<"\t"<<"最短路徑搜素成功!"<<endl; cout<<"請輸入任意按鍵,下面輸入到達路徑。"<<endl; getchar(); getchar(); print_route(STEP,mp2,m,n); } int main() { for(;;) { switch(menue_select()) { case 1: run_map1(); //固定地圖模式 system("pause"); break; case 2: run_map2(); //隨機地圖模式 system("pause"); break; case 3: run_map3(); //自定義地圖模式 system("pause"); break; case 4: exitt(); //退出地圖 } } return 0; }

題目4:完全二叉樹儲存結構轉換 具體設計要求: n個結點的完全二叉樹順序儲存在一維陣列a中,設計程式由此陣列得到該完全二叉樹的二叉連結串列結構。 (1)對轉換後的二叉連結串列結構的完全二叉樹進行層次遍歷。 (2)資料資訊通過文字檔案讀入和儲存。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<stack>
#define MaxSize 100
using namespace std;
typedef struct Btnode{
    int data;
    struct Btnode *lchild;
    struct Btnode *rchild;
}btnode;
int ans[MaxSize];           //儲存層次遍歷訪問的結點
int pos=0;

<