|
http://www.geocities.jp/m_hiroi/puzzle/puzdoc01.html¤Î·ÐÏ©¤òµá¤á¤ë¥×¥í¥°¥é¥à¤Ç¤¹¤¬¡¢search( 0, 6 )¤ÎÉôʬ¤Ç¥¹¥¿¡¼¥È¤È¥´¡¼¥ë¤ò·è¤á¤ë¤Î¤Ç¤¹¤¬¡¢¥é¥ó¥À¥à¤Ë¥¹¥¿¡¼¥È¤È¥´¡¼¥ë¤ò·è¤á¤¿¤¤¤Ç¤¹¡£¤½¤ÎºÝ¡¢¥¹¥¿¡¼¥È¤È¥´¡¼¥ë¤ÎÈÖ¹æ¤Ï°Û¤Ê¤ê¤Þ¤¹¡£
¤³¤Î¥×¥í¥°¥é¥à¤Ï¤¤¤¯¤Ä¤«¤Î·ÐÏ©¤¬Ãµº÷¤µ¤ì¡¢°ìÈֺǽé¤Ëɽ¼¨¤µ¤ì¤ë¤Î¤¬ºÇû·ÐÏ©¤Ç¤¹¤¬ºÇû·ÐÏ©¤À¤±¤òɽ¼¨¤µ¤»¤¿¤¤¤Ç¤¹¡£
¤ª´ê¤¤¤·¤Þ¤¹¡£
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NODE 7
#define SIZE 64
/* ÎÙÀܥꥹ¥È */
const char adjacent[NODE][4] = {
1, 2, -1, -1, /* A */
0, 2, 3, -1, /* B */
0, 1, 4, -1, /* C */
1, 4, 5, -1, /* D */
2, 3, 6, -1, /* E */
3, -1, -1, -1, /* F */
4, -1, -1, -1, /* G */
};
/* Queue */
char path[SIZE][NODE];
char length[SIZE];
/* ·ÐÏ©¤Îɽ¼¨ */
void print_path( int n, int goal )
{
int i;
int len = length[n];
for( i = 0; i <= len; i++ ){
printf("%c ", path[n][i] + 'A' );
}
printf("%c\n", goal + 'A' );
}
/* ÉýÍ¥Àèõº÷ */
void search( int start, int goal )
{
int rear = 1, front = 0;
path[0][0] = start;
length[0] = 0;
while( front < rear ){
int len = length[front];
int node = path[front][len];
int i, n;
for( i = 0; (n = adjacent[node][i]) != -1; i++ ){
if( memchr( path[front], n, len + 1 ) == NULL ){
if( n == goal ){
print_path( front, goal );
} else {
memcpy( path[rear], path[front], len + 1 );
path[rear][len + 1] = n;
length[rear] = len + 1;
rear++;
}
}
}
front++;
}
}
int main()
{
search( 0, 6 );
return 0;
}
|