老鼠吃乳酪或走迷宮,搜尋路徑問題
阿新 • • 發佈:2019-01-22
// // main.cpp // // Created by lidongxuan on 16/6/13. // Copyright © 2016年 lidongxuan. All rights reserved. // #include using namespace std; int isPath(int **grid, int m, int n); struct _TraversedNode{//建立已經判斷過的點的連結串列(連結串列內的資料全是已經查詢過的點) int x; int y; _TraversedNode *next; }; struct _Node{//節點結構體 int x; int y; }; int main(int argc, const char * argv[]) { // insert code here... int **grid= new int*[8]; for(int i=0;i<8;i++) { grid[i]= new int[8]; } grid[0][0]=1; grid[0][1]=1; grid[0][2]=0; grid[0][3]=0; grid[0][4]=0; grid[0][5]=0; grid[0][6]=0; grid[0][7]=1; grid[1][0]=1; grid[1][1]=1; grid[1][2]=1; grid[1][3]=1; grid[1][4]=1; grid[1][5]=1; grid[1][6]=1; grid[1][7]=1; grid[2][0]=1; grid[2][1]=0; grid[2][2]=0; grid[2][3]=0; grid[2][4]=1; grid[2][5]=0; grid[2][6]=0; grid[2][7]=1; grid[3][0]=1; grid[3][1]=1; grid[3][2]=1; grid[3][3]=0; grid[3][4]=1; grid[3][5]=0; grid[3][6]=0; grid[3][7]=1; grid[4][0]=0; grid[4][1]=1; grid[4][2]=0; grid[4][3]=0; grid[4][4]=1; grid[4][5]=1; grid[4][6]=1; grid[4][7]=1; grid[5][0]=0; grid[5][1]=1; grid[5][2]=0; grid[5][3]=0; grid[5][4]=0; grid[5][5]=0; grid[5][6]=0; grid[5][7]=1; grid[6][0]=0; grid[6][1]=1; grid[6][2]=0; grid[6][3]=9; grid[6][4]=1; grid[6][5]=1; grid[6][6]=1; grid[6][7]=1; grid[7][0]=0; grid[7][1]=1; grid[7][2]=1; grid[7][3]=1; grid[7][4]=0; grid[7][5]=0; grid[7][6]=1; grid[7][7]=0; for(int i=0;i<8;i++) { for(int j=0;j<8;j++) cout<x=0; TraversedNode->y=0; head=TraversedNode; p=TraversedNode; p->next=NULL; int count_node=0;//同一層節點計數器,沒更新一次加1,初始值為0 int num_node=1;//同一層節點總數量,第一層節點數為1,故初始化count為1 _Node *node=new _Node[n+m];//當前層的所有非零點放在node[]結構體陣列中,可證明陣列長度不會超過m+n _Node *node_next=new _Node[n+m];//下一層的所有非零點放在node_next[]結構體陣列中 node[0].x=0; node[0].y=0; while(1) { for(int i=0;ix==node[i].x+1)&&(p_check->y==node[i].y)) { p_check=NULL; flag_down_success=false; } else { p_check=p_check->next; } } if(flag_down_success)//如果是新點,將該點放入已遍歷連結串列,並將該點位置放入下一層即node_next[k]中用於下個週期的搜尋 { TraversedNode=new _TraversedNode; TraversedNode->x=node[i].x+1; TraversedNode->y=node[i].y; p->next=TraversedNode; p=TraversedNode; p->next=NULL; node_next[count_node].x=node[i].x+1; node_next[count_node].y=node[i].y; count_node++; } flag_down_success=true; } } if(node[i].x-1>=0)//向上搜尋子節點 { if(grid[node[i].x-1][node[i].y]!=0) { if(grid[node[i].x-1][node[i].y]==9) { step++; cout<<"可以最短"<x==node[i].x-1)&&(p_check->y==node[i].y)) { p_check=NULL; flag_up_success=false; } else { p_check=p_check->next; } } if(flag_up_success) { TraversedNode=new _TraversedNode; TraversedNode->x=node[i].x-1; TraversedNode->y=node[i].y; p->next=TraversedNode; p=TraversedNode; p->next=NULL; node_next[count_node].x=node[i].x-1; node_next[count_node].y=node[i].y; count_node++; } flag_up_success=true; } } if(node[i].y+1<=n-1)//向右搜尋子節點 { if(grid[node[i].x][node[i].y+1]!=0) { if(grid[node[i].x][node[i].y+1]==9) { step++; cout<<"可以最短"<x==node[i].x)&&(p_check->y==node[i].y+1)) { p_check=NULL; flag_right_success=false; } else { p_check=p_check->next; } } if(flag_right_success) { TraversedNode=new _TraversedNode; TraversedNode->x=node[i].x; TraversedNode->y=node[i].y+1; p->next=TraversedNode; p=TraversedNode; p->next=NULL; node_next[count_node].x=node[i].x; node_next[count_node].y=node[i].y+1; count_node++; } flag_right_success=true; } } if(node[i].y-1>=0)//向左搜尋子節點 { if(grid[node[i].x][node[i].y-1]!=0) { if(grid[node[i].x][node[i].y-1]==9) { step++; cout<<"可以最短"<x==node[i].x)&&(p_check->y==node[i].y-1)) { p_check=NULL; flag_left_success=false; } else { p_check=p_check->next; } } if(flag_left_success) { TraversedNode=new _TraversedNode; TraversedNode->x=node[i].x; TraversedNode->y=node[i].y-1; p->next=TraversedNode; p=TraversedNode; p->next=NULL; node_next[count_node].x=node[i].x; node_next[count_node].y=node[i].y-1; count_node++; } flag_left_success=true; } } } if(count_node==0)//若k=0則代表該搜尋週期內的所有最新點都已走到盡頭,無可拓展的子節點,搜尋結束,不存在到達9的路徑 { cout<<"不存在到達終點的路徑"<