横型から縦型への変換
Posted: 2010年7月02日(金) 14:02
今、横型探索から縦型探索に書き換えているんですが…
どう書き換えたらよいかわかりません。
すみませんが…誰か教えていただけないでしょうか??
横型のプログラムです。
ちなみに言語はC言語です。
int main( void )
{
struct Cell start_state;
struct Cell open_list;
struct Cell closed_list;
struct Cell *temp;
struct Cell *s;
int i,j;
/* リストの初期化(空リストにする)*/
open_list.prev = open_list.next = &open_list;
closed_list.prev = closed_list.next = &closed_list;
start_state.prev = start_state.next = &start_state;
/* 初期状態の設定 */
start_state.state.wolf = 0;
start_state.state.goat = 0;
start_state.state.cabbage = 0;
start_state.state.man = 0;
/* OpenList に初期状態を追加 */
push_back( &open_list, &start_state );
j=0;
/* OpenList が空になるまで、以下を繰り返し実行 */
while( open_list.next != &open_list ) {
j++;
/* OpenList の先頭から状態を一つ取り出す */
s = open_list.next;
/* 途中経過を表示 */
print_progress( s , &open_list , &closed_list , j );
printf("\n");
/* OpenList からsを削除 */
remove_state( s );
/* ClosedList の末尾に状態 s を追加 */
push_back( &closed_list,s );
/* 目標状態なら結果を出力して終了 */
if ( succeeded(s) ) {
print_result( s, &closed_list );
break;
}
/* 禁止状態なら、状態 s を破棄し次に移る */
if ( failed(s) ) {
printf("%d%d%d%d は禁止状態 \n",
s->state.man, s->state.wolf,
s->state.goat, s->state.cabbage);
continue;
}
for( i=0; i<4 ; i++) {
/* 状態 s に可能なオペレーターを適用 */
switch( i ) {
case 0:
temp = move_man( s ); /* 人を移動 */
break;
case 1:
temp = move_wolf( s ); /* 狼を移動 */
break;
case 2:
temp = move_goat( s ); /* 山羊を移動 */
break;
case 3:
temp = move_cabbage( s ); /* キャベツを移動 */
break;
}
/* OpenListの更新(横型探索)*/
if ( find( &open_list, temp ) == &open_list
&& find( &closed_list, temp ) == &closed_list )
/* OpenList、ClosedListに無ければOpenListの末尾に追加 */
push_back( &open_list, temp );
}
}
return( 0 );
}
どう書き換えたらよいかわかりません。
すみませんが…誰か教えていただけないでしょうか??
横型のプログラムです。
ちなみに言語はC言語です。
int main( void )
{
struct Cell start_state;
struct Cell open_list;
struct Cell closed_list;
struct Cell *temp;
struct Cell *s;
int i,j;
/* リストの初期化(空リストにする)*/
open_list.prev = open_list.next = &open_list;
closed_list.prev = closed_list.next = &closed_list;
start_state.prev = start_state.next = &start_state;
/* 初期状態の設定 */
start_state.state.wolf = 0;
start_state.state.goat = 0;
start_state.state.cabbage = 0;
start_state.state.man = 0;
/* OpenList に初期状態を追加 */
push_back( &open_list, &start_state );
j=0;
/* OpenList が空になるまで、以下を繰り返し実行 */
while( open_list.next != &open_list ) {
j++;
/* OpenList の先頭から状態を一つ取り出す */
s = open_list.next;
/* 途中経過を表示 */
print_progress( s , &open_list , &closed_list , j );
printf("\n");
/* OpenList からsを削除 */
remove_state( s );
/* ClosedList の末尾に状態 s を追加 */
push_back( &closed_list,s );
/* 目標状態なら結果を出力して終了 */
if ( succeeded(s) ) {
print_result( s, &closed_list );
break;
}
/* 禁止状態なら、状態 s を破棄し次に移る */
if ( failed(s) ) {
printf("%d%d%d%d は禁止状態 \n",
s->state.man, s->state.wolf,
s->state.goat, s->state.cabbage);
continue;
}
for( i=0; i<4 ; i++) {
/* 状態 s に可能なオペレーターを適用 */
switch( i ) {
case 0:
temp = move_man( s ); /* 人を移動 */
break;
case 1:
temp = move_wolf( s ); /* 狼を移動 */
break;
case 2:
temp = move_goat( s ); /* 山羊を移動 */
break;
case 3:
temp = move_cabbage( s ); /* キャベツを移動 */
break;
}
/* OpenListの更新(横型探索)*/
if ( find( &open_list, temp ) == &open_list
&& find( &closed_list, temp ) == &closed_list )
/* OpenList、ClosedListに無ければOpenListの末尾に追加 */
push_back( &open_list, temp );
}
}
return( 0 );
}