関数の呼び出し

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

関数の呼び出し

#1

投稿記事 by matu » 16年前

すいませんまた質問させてください。
関数の複数回呼び出すことがうまくできません、
コードの中に質問も書いておきました。
#include <stdio.h>
#define MAX 61
#define N   4
int v[N + 1];
int p[N + 1];
int minv[N + 1];
int min1;
void perm(int);
void perm1(int);
int main()
{
    int i,tmp;
	int a[2][5]={{0,0,0,0,0},
	             {0,1,2,3,4}};
	for (i=1;i<=N;i++){ 
		p = i;
	}
	
        min1=10000;
		v[0]=0,
		v[1]=8,
		v[2]=7,
		v[3]=13,
		v[4]=24,
		/*交換*/(1と8の交換)
		tmp=a[1][1];
	      a[1][1]=v[1];
		v[1]=tmp;
		/*呼び出し*/
		perm(1);
		/*元にもどす*/
		tmp=a[1][1];
		a[1][1]=v[1];
		v[1]=tmp;
	        /*交換*/(2と8の交換)
		tmp=a[1][2];
		a[1][2]=v[1];
		v[1]=tmp;
                 ここで「2,7,13,24」の最短距離とその道順を求めた
         permの処理をもう一回したいのですがわかりません。
         どうやってよびだせばよいでしょうか。
		return 0;
	
}
 void perm(int i)
 {
	 int j, t,sum1;
	 sum1=0;
	 if (i < N)
	 {
        for (j = i; j <= N; j++) {
            t = p=v;  p=v = p[j]=v[j];  p[j]=v[j] = t;
            perm(i + 1);
            t = p=v;  p=v = p[j]=v[j];  p[j]=v[j] = t;
		}
		
	 } 
	 
    else {
int d[MAX+1][MAX+1]={
};

	/*距離(sum)をだしている*/
for(j=1;j<N;j++)
    {
	   sum1 +=d[v[j]][v[j+1]];
    }
    /* printf("%d",sum1);*/
   /*printf("%d",sum2);*/
     /*printf("\n");*/

if(min1>=sum1){
	min1=sum1;
	for(j=1;j<=N;j++){
		minv[j]=v[j];
		printf("%d ",minv[j]);
	}
}
    printf("%d",min1);
	printf("\n");

	}
	}

kazuoni

Re:関数の呼び出し

#2

投稿記事 by kazuoni » 16年前

すみません。めちゃくちゃ見づらかったので、字下げしておきました。
先に貼り付けておきます。
あ、
>/* printf("%d",sum1);*/
>/*printf("%d",sum2);*/
>/*printf("\n");*/
などは初めから消しておいたほうがいいと思います。
次回からは気を付けてください。
#include <stdio.h>
#define MAX 61
#define N   4
int v[N + 1];
int p[N + 1];
int minv[N + 1];
int min1;
void perm(int);
void perm1(int);
int main()
{
	int i,tmp;
	int a[2][5]={{0,0,0,0,0},{0,1,2,3,4}};
	for (i=1;i<=N;i++)
	{
		p = i;
	}
	min1=10000;
	v[0]=0,
	v[1]=8,
	v[2]=7,
	v[3]=13,
	v[4]=24,
	/*交換(1と8の交換)*/
	tmp=a[1][1];
	a[1][1]=v[1];
	v[1]=tmp;
	/*呼び出し*/
	perm(1);
	/*元にもどす*/
	tmp=a[1][1];
	a[1][1]=v[1];
	v[1]=tmp;
	/*交換(2と8の交換)*/
	tmp=a[1][2];
	a[1][2]=v[1];
	v[1]=tmp;
                 ここで「2,7,13,24」の最短距離とその道順を求めた
         permの処理をもう一回したいのですがわかりません。
         どうやってよびだせばよいでしょうか。
	return 0;
	
}
 void perm(int i)
{
  int j, t,sum1;
  sum1=0;
  if (i < N)
  {
	for (j = i; j <= N; j++)
	{
      t = p=v;  p=v = p[j]=v[j];  p[j]=v[j] = t;
      perm(i + 1);
            t = p=v;  p=v = p[j]=v[j];  p[j]=v[j] = t;
	}		
  }
  else
  {
	int d[MAX+1][MAX+1]={};
	/*距離(sum)をだしている*/
	for(j=1;j<N;j++)
     {
	  sum1+=d[v[j]][v[j+1]];
     }
     if(min1>=sum1)
     {
       min1=sum1;
       for(j=1;j<=N;j++)
       {
		minv[j]=v[j];
		printf("%d ",minv[j]);
       }
     }
     printf("%d",min1);
     printf("\n");
  }
 }

matu

Re:関数の呼び出し

#3

投稿記事 by matu » 16年前

すいません...

Mist

Re:関数の呼び出し

#4

投稿記事 by Mist » 16年前

この掲示板はタブ幅が8なので、エディタの設定でタブ幅が8以外の人(大半は4だと思うけど)はタブとスペースを混ぜるとすれずれになってしまいますね(^^;

non

Re:関数の呼び出し

#5

投稿記事 by non » 16年前

なぜか、前の時と同じように訳がわからない変数が、元に戻りましたね。
何をやりたいのか、配列pや配列aが何を意味するのか説明してください。

再度関数を呼ぶのなら
ただたんに、再度 perm(1);すればいいのですが、前提として配列vに行きたい店が格納されているという
のが、この前までの条件でした。

kazuoni

Re:関数の呼び出し

#6

投稿記事 by kazuoni » 16年前

ありゃー。自分もずれてましたね^^;訂正しました。。失礼しました。

non

Re:関数の呼び出し

#7

投稿記事 by non » 16年前

ところで、下の掲示板に投稿されている方は、同じ大学の方でしょうか?
http://www3.realint.com/cgi-bin/tarticl ... intc2+9260
こちらのを読んでも、何をやりたいのかわかりません。
課題を正確に与えられた条件を含めて書いていただくとわかりやすいのですが。

matu

Re:関数の呼び出し

#8

投稿記事 by matu » 16年前

すいません・・・同じ者です。
課題を正確に説明するために、もっと与えられた課題自体をもっと理解します。

閉鎖

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