1. 程式人生 > >老鼠吃乳酪或走迷宮,搜尋路徑問題

老鼠吃乳酪或走迷宮,搜尋路徑問題

//
//  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<<"不存在到達終點的路徑"<