横型探索(幅優先探索)

/****************************/
/* 横型探索(幅優先探索)   */
/*      coded by Y.Suganuma */
/****************************/
#include <stdio.h>
#include <queue>
using namespace std;

void print(queue<char> &q) {
	printf("   queue の状態: ");
	if (q.empty())
		printf("空です\n");
	else
		printf("先頭及び最後尾: %c %c, 要素数: %d\n", q.front(), q.back(), q.size());
}

int main()
{
	queue<char> q;

	printf("S の追加\n");
	q.push('S');
	print(q);

	printf("先頭 S を削除し,A, B, C を追加\n");
	q.pop();
	q.push('A');
	q.push('B');
	q.push('C');
	print(q);

	printf("先頭 A を削除し,D, E を追加\n");
	q.pop();
	q.push('D');
	q.push('E');
	print(q);

	printf("先頭 B を削除\n");
	q.pop();
	print(q);

	printf("先頭 C を削除し,F, G を追加\n");
	q.pop();
	q.push('F');
	q.push('G');
	print(q);

	printf("先頭 D を削除\n");
	q.pop();
	print(q);

	printf("先頭 E を削除\n");
	q.pop();
	print(q);

	printf("先頭 F を削除\n");
	q.pop();
	print(q);

	printf("先頭 G を削除\n");
	q.pop();
	print(q);

	return 0;
}

----------------再帰関数の利用----------------

/*****************************************/
/* 横型探索(幅優先探索)                */
/*      n : ノードの数                   */
/*      r : ノードからノードへの接続状況 */
/*      node : ノードの名前              */
/*      d : 深さ                         */
/*      m : 深さdにあるノードの数        */
/*      nd : 深さdにあるノード           */
/*           coded by Y.Suganuma         */
/*****************************************/
#include <stdio.h>

void width(int n, int **r, char *node, int d, int m, int *nd)
{
	int i1, i2, k, m1, *nd1 = new int [n];

	printf("深さ: %d\n", d);
	for (i1 = 0; i1 < m; i1++)
		printf("%c ", node[nd[i1]]);
	printf("\n");

	if (d < 3) {
		m1 = 0;
		for (i1 = 0; i1 < m; i1++) {
			k = nd[i1];
			for (i2 = 0; i2 < n; i2++) {
				if (r[k][i2] > 0) {
					nd1[m1] = i2;
					m1++;
				}
			}
		}
		if (m1 > 0)
			width(n, r, node, d+1, m1, nd1);
	}

	delete [] nd1;
}

int main()
{
	int i1, i2, **r, *nd;
	char *node = "SABCDEFG";

	nd = new int [4];
	r  = new int * [8];
	for (i1 = 0; i1 < 8; i1++) {
		r[i1] = new int [8];
		for (i2 = 0; i2 < 8; i2++)
			r[i1][i2] = 0;
	}

	r[0][1] = 1;
	r[0][2] = 1;
	r[0][3] = 1;
	r[1][4] = 1;
	r[1][5] = 1;
	r[3][6] = 1;
	r[3][7] = 1;

	nd[0] = 0;
	width(8, r, node, 1, 1, nd);

	return 0;
}