C語言的A 演算法

2021-07-08 14:49:36 字數 2878 閱讀 5790

畢業**中需過用到路徑優化和誘導的演算法,網上看到很多資料,原理是簡單的,**實現頗為不易,不過站在巨人的肩膀上還是容易的,借他人之石攻玉,再次總結一下。

c語言:

小刀刀的一篇a*演算法介紹,****之中存在些許錯誤,經除錯後c語言的**如下:陣列中1代表起點,2代表終點,0代表可以通過,3代表障礙物

#include #include #define startnode	1

#define endnode 2

#define barrier 3

typedef struct astarnode

astarnode, *pastarnode;

astarnode map_maze[10][10]; // 結點陣列

pastarnode open_table[100]; // open表

pastarnode close_table[100]; // close表

int open_node_count; // open表中節點數量

int close_node_count; // close表中結點數量

pastarnode path_stack[100]; // 儲存路徑的棧

int top = -1; // 棧頂

// 交換兩個元素

void swap( int idx1, int idx2 )

// 堆調整

void adjust_heap( int /*i*/nindex )

// 往下調整( 要比較左右孩子和cuur parent )

while ( child < open_node_count )

if (open_table[curr]->s_g + open_table[curr]->s_h <= open_table[child]->s_g + open_table[child]->s_h)

else

}if (curr != nindex)

// 往上調整( 只需要比較cuur child和parent )

while (curr != 0)

else

}} // 判斷鄰居點是否可以進入open表

void insert_to_opentable( int x, int y, pastarnode curr_node, pastarnode end_node, int w )

}adjust_heap( i ); // 下面調整點}}

else // 不在open中

} }}

// 查詢鄰居

// 對上下左右8個鄰居進行查詢

void get_neighbors( pastarnode curr_node, pastarnode end_node )

if ( ( x - 1 ) >= 0 && ( x - 1 ) < 10 && y >= 0 && y < 10 )

if ( x >= 0 && x < 10 && ( y + 1 ) >= 0 && ( y + 1 ) < 10 )

if ( x >= 0 && x < 10 && ( y - 1 ) >= 0 && ( y - 1 ) < 10 )

if ( ( x + 1 ) >= 0 && ( x + 1 ) < 10 && ( y + 1 ) >= 0 && ( y + 1 ) < 10 )

if ( ( x + 1 ) >= 0 && ( x + 1 ) < 10 && ( y - 1 ) >= 0 && ( y - 1 ) < 10 )

if ( ( x - 1 ) >= 0 && ( x - 1 ) < 10 && ( y + 1 ) >= 0 && ( y + 1 ) < 10 )

if ( ( x - 1 ) >= 0 && ( x - 1 ) < 10 && ( y - 1 ) >= 0 && ( y - 1 ) < 10 ) }

int main()

, ,,,

,,,,

,,

};int i,j;

// 下面準備點

for( i = 0; i < 10; ++i )

else if( map_maze[i][j].s_style == endnode ) // 終點

printf("%d ", maze[i][j]);

} printf("\n");

} // 下面使用a*演算法得到路徑

open_table[open_node_count++] = start_node; // 起始點加入open表

start_node->s_is_in_opentable = 1; // 加入open表

start_node->s_g = 0;

start_node->s_h = abs(end_node->s_x - start_node->s_x) + abs(end_node->s_y - start_node->s_y);

start_node->s_parent = null;

if ( start_node->s_x == end_node->s_x && start_node->s_y == end_node->s_y )

is_found = 0;

while( 1 )

get_neighbors( curr_node, end_node ); // 對鄰居的處理

if ( open_node_count == 0 ) // 沒有路徑到達

}if ( is_found )

while( top >= 0 ) // 下面是輸出路徑看看~

else

}} else

}

c語言演算法

統計從1到100的和 統計從鍵盤輸入字元的個數 請按要求實現以下選單 中心 學員成績管理系統 1 輸入學員成績 2 學員成績修改 3 學員成績統計 4 退出 如果選擇了1 4 請輸出對應選單的文字內容,輸入其他的字元,請輸出 輸入錯誤,請輸入1 4數字鍵 輸入一串字串,統計0 9的個數 若乙個口袋中...

C 語言的排序演算法

氣泡排序 氣泡排序 英語 bubble sort 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序 如從大到小 首字母從a到z 錯誤就把他們交換過來。選擇排序 選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中...

c語言峰值演算法 C語言 回文數程式演算法

觀察數字 12321,123321 都有乙個共同的特徵,無論從左到右讀還是從右向左讀,都是相同的。這樣的數字叫做回文數字。本題要求你找到一些5位或6位的十進位制數字。滿足如下要求 該數字的各個數字之和等於輸入的整數。輸入格式 乙個正整數 n 10 輸出格式 若干行,每行包含乙個滿足要求的5位或6位整...