オイラー・一筆書きプログラムについて

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

オイラー・一筆書きプログラムについて

#1

投稿記事 by 佐々木 » 11年前

授業の課題でオイラーの一筆書きのプログラムが出題されたのですが、いまいち理解できません。
特に最初のint a [Node+1][Node+1={...}のところと、下部のvoid visit(int i)の部分がよくわかりません。
どうかよろしくお願いいたします。

コード:

#include<stdio.h>
#define Node 4   /*Nodeを4に設定 接点の数*/
#define Root 6       /*Rootを6に設定 辺の数*/
#define Start 1      /*Startを1に設定 一筆書きの図の①から始めるということ*/

int a[Node+1][Node+1]={{0,0,0,0,0},
		    {0,0,1,0,1},
		       {0,1,0,1,2},
   {0,0,1,0,1},
   {0,1,2,1,0}};
					   
int success,
	v[Root+1],
	n;

void visit(int);
	
void main(void)
	{
		success=0; n=Root;
		visit(Start);
		if(success==0) /*一度も始点に戻ってこれなかった場合*/
			printf("解なし\n");
	}

void visit(int i)
	{
		int j;
		v[n]=i;
		if(n==0 && i==Start){
			printf("解 %d:",++success);
			for(i=0;i<=Root;i++)
				printf("%d",v[i]);
			printf("\n");
		}
		else {
			for(j=1;j<=Node;j++)
				if(a[i][j]!=0){
					a[i][j]--;
					a[j][i]--;
					n--;
					visit(j);
					a[i][j]++;
					a[j][i]++;
					n++;
				}
	}
	}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: オイラー・一筆書きプログラムについて

#2

投稿記事 by softya(ソフト屋) » 11年前

同じ方でですよね?
「オイラーの一筆書きについて • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=15363
同じ内容で2つのトピック立ち上げないことと、名前は統一をお願いします。
あちらを閉鎖しておきますが、名前は統一して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 14年前

Re: オイラー・一筆書きプログラムについて

#3

投稿記事 by box » 11年前

松浦さんなのか佐々木さんなのか、よくわかりませんが…

オイラーの一筆書きというのが、
ケーニヒスベルクの橋
そのものなのか
それとも別の話なのか、
「一筆書きの図の①」というのを貼って、
みんなによくわかるようにしてほしいところです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

佐々木

Re: オイラー・一筆書きプログラムについて

#4

投稿記事 by 佐々木 » 11年前

大変失礼いたしました。掲示板というものを使うこと自体あまりなかったので軽率でした。
名前のほうは佐々木で固定させていただきます。
図のほうですが
画像
このような形になります

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: オイラー・一筆書きプログラムについて

#5

投稿記事 by usao » 11年前

何をするプログラムなんですか?っていう.

一筆書きができるのかできないのかを判定する ものなのか,
できるならばその具体的経路を出力する ものなのか

そのくらいは説明しましょうよ.いくらなんでも.


で,aなる配列はノード間の連結数か何かでしょう.
(添え字0はダミーか)

佐々木

Re: オイラー・一筆書きプログラムについて

#6

投稿記事 by 佐々木 » 11年前

失礼いたしました。説明不足でした。
このプログラムは、一筆書きができるかを判別してできるならば、経路を表示するプログラムになります。
もし経路が何通りかあるならすべて表示するプログラムです。

かずま

Re: オイラー・一筆書きプログラムについて

#7

投稿記事 by かずま » 11年前

コード:

#include <stdio.h>

#define NODE  4   /* NODEを 4に設定 節点の数 */
#define ROUTE 6   /* ROUTEを6に設定 辺の数   */
#define START 1   /* STARTを1に設定 点1から始める */
 
int a[NODE+1][NODE+1] = { /* a[i][j] は、点i から点j への辺の数 */
    { 0, 0, 0, 0, 0 }, 
    { 0, 0, 1, 0, 1 },  /* 点1から, 点2まで1本, 点4まで1本             */
    { 0, 1, 0, 1, 2 },  /* 点2から, 点1まで1本, 点3まで1本, 点4まで2本 */
    { 0, 0, 1, 0, 1 },  /* 点3から, 点2まで1本, 点4まで1本             */
    { 0, 1, 2, 1, 0 }   /* 点4から, 点1まで1本, 点2まで2本, 点3まで1本 */
};
                       
int success;      /* 見つかった経路の数 */
int v[ROUTE+1];   /* 経路(通過点の記録) */
int n;            /* 残りの辺の数       */
 
void visit(int);
    
int main(void)
{
    success = 0;       /* 経路が見つかっていない */
    n = ROUTE;         /* 開始前の残りの辺の数 */
    visit(START);      /* 探索開始 */
    if (success == 0)  /* 経路が一つも見つからなかった */
        printf("解なし\n");
    return 0;
}

void visit(int i)    /* 点i に行く */
{
    int j;
    v[n] = i;        /* 点i を経路に加える */
    if (n==0 && i==START) { /* 全部の辺を通って、始点に戻った */
        printf("解 %d:", ++success);
        for (i = 0; i <= ROUTE; i++)
            printf("%d", v[i]);
        printf("\n");
    }
    else {
        for (j = 1; j <= NODE; j++) {  /* 点j に行けるかどうか全部試す */
            if (a[i][j] != 0) {  /* 点i から点j への辺があった */
                a[i][j]--;   /* 点i から点j への辺を通るので減る */
                a[j][i]--;   /* 点j から点i への辺も減る */
                n--;         /* 残りの辺の数も減る */
                visit(j);    /* 点j に行く */
                a[i][j]++;   /* 点i から点j への辺復活 */
                a[j][i]++;   /* 点j から点i への辺復活 */
                n++;         /* 残りの辺の数も元の戻る */
            }
        }
    }
}

佐々木

Re: オイラー・一筆書きプログラムについて

#8

投稿記事 by 佐々木 » 11年前

無事解決いたしました
皆様ありがとうございました

閉鎖

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