アプリ版:「スタンプのみでお礼する」機能のリリースについて

「0」「1」のみの数値を用いてC言語で対称行列を作成したいのですが、アルゴリズムを知っている方がいたら教えてください。

A 回答 (3件)

正方行列 a[n][n] において、


a[i][j] と a[j][i] とが等しくなるようにしてください。
    • good
    • 0
この回答へのお礼

お答えありがとうございました。a[i][j] と a[j][i]を同じにすることは分かっていたのですが、ループのまわし方が分からなかったのです。

お礼日時:2007/08/23 19:29

質問の意味がもう一つはっきりしませんが、ある次元の配列で、


値が0または1である対称な行列をすべて作りたいというのなら、
たとえば、以下のようにすればいいのではないですか?

対称だというのだから、ほんとは、N*(N+1)/2個の要素しか必要なくて、
N*(N+1)/2 個の要素に 0 か 1 を設定すれば、それで終わりなのですが。。

====3x3の行列
#include <stdio.h>

#define N 3

void print(int a[][N])
{
int i, j;
for (i = 0; i < N; ++i) {
for (j = 0; j < N; ++j)
printf("%d ", a[i][j]);
putchar('\n');
}
printf("---------------\n");
}

void assign(int a[][N])
{
int i, j;
for (i = 0; i < N; ++i)
for (j = i + 1; j < N; ++j)
a[j][i] = a[i][j];
}

void set(int i, int j, int a[][N])
{
if (i == N - 1 && j == N - 1) {
a[i][j] = 0;
assign(a);
print(a);
a[i][j] = 1;
assign(a);
print(a);
} else {
int ii, jj;
if (j < N - 1) {
ii = i; jj = j + 1;
} else {
ii = i + 1; jj = ii;
}
a[i][j] = 0;
set(ii, jj, a);
a[i][j] = 1;
set(ii, jj, a);
}
}

int main(void)
{
int a[N][N];
set(0, 0, a);
}
    • good
    • 0
この回答へのお礼

お答えありがとうございました。参考にさせていただいて以下のように作成しました。アドバイスありがとうございました。

int (int T[10][10]){

int x,i,j,count=1;
float r;

for(i=0;i<10;i++)
{
for(j=0;j<count;j++)
{
r = ((float)rand() / 32768.0);

if(i==j) T[i][j] = 0;

else
{
if(r <= 0.2)
{
T[i][j] = 1;
T[j][i] = 1;
}
else
{
T[i][j] = 0;
T[j][i] = 0;
}
}

}
count++;
}

お礼日時:2007/08/23 19:36

なるほど、そういう意味でしたか^^


C99だと可変の配列サイズを渡せるのでしたよね?
だから、10に固定にせずに変数で渡すほうがいいのでは?
====
#include <stdlib.h>

int setsym(int n, int t[n][n])
{
int i, j;
for (i = 0; i < n; ++i) {
t[i][i] = 0;
for (j = 0; j < i; ++j)
if ((float)rand() / RAND_MAX <= 0.2) t[i][j] = t[j][i] = 0;
else t[i][j] = t[j][i] = 1;
}
}

int main(void)
{
int a[10][10];
setsym(10, a);
}
    • good
    • 0
この回答へのお礼

なるほど。そうすればいいのですね!色々とありがとうございました^^

お礼日時:2007/08/23 22:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!