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