経路の問題です。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
miku

経路の問題です。

#1

投稿記事 by miku » 18年前

(0,0)から(x,y)(x,yは自然数)まで格子点を通る経路の問題です。

図のようにx,yの方向へ、上、斜め、右方向に進めます。戻ることは出来ません。
この(0,0)からx,yまでの全ての経路を知りたいのですが、なかなか思うように結果が出ません・・。
例えば(0,0)から(2,2)までの経路であった場合

経路1
(0,0) -> (1,0) -> (2,0) -> (2,1) -> (2,2)

経路2
(0,0) -> (1,0) -> (1,1) -> (2,2)

とかこういう感じで全通り出したいのですが・・。
再帰関数を使って若干作ってみたもののうまくいきません・・。

一応こんな感じです。
#include <stdio.h>
#include <string.h>
int len_a=2,len_b=2;
void serch(int ia,int ib){
	int i;
	printf("(%d,%d)\n",ia,ib);
	for(i=0;i<3;i++){
		if(i==0 && ia<len_a)
			ia++;
		else if(i==1 && ia<len_a && ib<len_b)
			ia++ , ib++;
		else if(i==2 && ib<len_b)
			ib++;
		else
			continue;
		serch(ia,ib);
	}
}
int main(){
	serch(0,0);
	return 0;
}
 
すみませんが、おわかりになるかたご指導よろしくお願いします。

toyo

Re:経路の問題です。

#2

投稿記事 by toyo » 18年前

こうなりました
#include <stdio.h>

#define POINT_X 2
#define POINT_Y 2

typedef struct coordinates {
	int x;
	int y;
} COORDINATES;
COORDINATES co[1000];
int top = 0;

void search(int x,int y){
	COORDINATES c;
	int i;

	c.x = x;
	c.y = y;
	co[top] = c;
	top++;
	if (x == POINT_X && y == POINT_Y)
	{
		// 終点
		for (i = 0; i < top; i++) 
		{
			printf("(%d,%d)", co.x, co.y);
		}
		printf("\n");
		// 1個戻る
		top--;
		return;
	}
	if (x < POINT_X)
	{
		// 右へ
		search(x+1, y);
	}
	if (x < POINT_X && y < POINT_Y)
	{
		// 斜めへ
		search(x+1, y+1);
	}
	if (y < POINT_Y)
	{
		// 上へ
		search(x, y+1);
	}
	// 1個戻る
	top--;
}

int main()
{
	search(0,0);
	return 0;
}

miku

無題

#3

投稿記事 by miku » 18年前

なるほど!!

再帰の仕方がわかっていませんでした^^;;
ありがとうございました!!

閉鎖

“C言語何でも質問掲示板” へ戻る