實驗周代碼(迷宮+完全二叉樹儲存結構轉換)
阿新 • • 發佈:2018-12-20
題目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;
<