1.やりたいこと
配列1にABCDE
配列2にABDEF
が入っていた時にお互いの配列の共通点の数を取り出す
(今回だったらABDEが共通しているので4を取り出す)
ようなプログラミングをc言語で書きたいです。
2.作っているプログラム
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
//節点
enum { S, A, B, C, D, E, F, G }; //Sは終端を表す
//枝の正常確率
double r = 0.9;
#define N 7
#define M 4
// 隣接リスト
int a[N + 1][M] = {
{S},
{B, C, S},
{A, C, D, S},
{A, B, E, S},
{B, E, F, S},
{C, D, G, S},
{D, S},
{E, S},
};
//隣接リスト表示
void printlist(void)
{
printf("入力した隣接リスト\n");
for (int i = 1; i <= N; i++)
{
// 隣接リストの成分判定
int edges[N + 1] = { 0 };
for (int j = 0; j < M; j++)
{
int y = a[j];
if (y == 0) {
edges[y] = 0;
}
else {
edges[y] = 1;
}
}
// 行の出力
printf("%d", edges[1]);
for (int j = 2; j <= N; j++)
{
printf(" %d", edges[j]);
}
printf("\n");
}
printf("\n");
}
// 経路
int path[N];
bool visited[N + 1];
// 経路の表示
void print_path(int n)
{
printf("経路%d ", n);
for (int i = 0; i < n; i++)
{
printf("%c ", 'A' + path - 1);
}
printf("\n");
for (int i = 0; i < n; i++)
{
printf("%d ", path );
}
printf("\n");
}
//タイセットごとの正常確率計算
void reliability(int n)
{
int i = 1;
n = n--;
printf("正常確率=%lf\n", pow(r, n));
probability(n);
}
//タイセットごとの正常確率
double arr[100];
//正常確率の格納
int probability(int n)
{
static int i = 1;
arr = pow(r, n);
return i++;
}
//タイセットの数
int tie_times(void)
{
static int count = 0;
return count++;
}
// 深さ優先探索
void dfs(int n, int goal)
{
int x = path[n - 1];
if (x == goal)
{
print_path(n);
reliability(n);
tie_times();
}
else
{
for (int i = 0; i < M; i++)
{
int y = a[x];
if (y == 0) break;
if (!visited[y])
{
path[n] = y;
visited[y] = true;
dfs(n + 1, goal);
visited[y] = false;
}
}
}
}
int main(void)
{
printlist();
path[0] = A;
visited[A] = true;
dfs(1, G);
printf("タイセットの数 %d\n", tie_times());
printf("正常 %lf", arr[1]);
printf("正常 %lf", arr[2]);
printf("正常 %lf", arr[3]);
printf("正常 %lf", arr[4]);
printf("\n");
return 0;
}
3.困っていること
書いてあるプログラムのほとんどがネットから持ってきたものなので、ネットで探して見つからないものができません。
4.知りたいこと
1.で述べたことが知りたいです。
5.c言語の自分の知識
昨日始めたので皆無です。
配列から共通の文字を取り出したいです
-
- 記事: 2
- 登録日時: 2年前
Re: 配列から共通の文字を取り出したいです
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
//節点
enum { S, A, B, C, D, E, F, G }; //Sは終端を表す
//枝の正常確率
double r = 0.9;
#define N 7
#define M 4
// 隣接リスト
int a[N + 1][M] = {
{S},
{B, C, S},
{A, C, D, S},
{A, B, E, S},
{B, E, F, S},
{C, D, G, S},
{D, S},
{E, S},
};
//隣接リスト表示
void printlist(void)
{
printf("入力した隣接リスト\n");
for (int i = 1; i <= N; i++)
{
// 隣接リストの成分判定
int edges[N + 1] = { 0 };
for (int j = 0; j < M; j++)
{
int y = a[i][j];
if (y == 0) {
edges[y] = 0;
}
else {
edges[y] = 1;
}
}
// 行の出力
printf("%d", edges[1]);
for (int j = 2; j <= N; j++)
{
printf(" %d", edges[j]);
}
printf("\n");
}
printf("\n");
}
// 経路
int path[N];
bool visited[N + 1];
// 経路の表示
void print_path(int n)
{
printf("経路%d ", n);
for (int i = 0; i < n; i++)
{
printf("%c ", 'A' + path[i] - 1);
}
printf("\n");
for (int i = 0; i < n; i++)
{
printf("%d ", path[i] );
}
printf("\n");
}
//タイセットごとの正常確率計算
void reliability(int n)
{
int i = 1;
n = n--;
printf("正常確率=%lf\n", pow(r, n));
probability(n);
}
//タイセットごとの正常確率
double arr[100];
//正常確率の格納
int probability(int n)
{
static int i = 1;
arr[i] = pow(r, n);
return i++;
}
//タイセットの数
int tie_times(void)
{
static int count = 0;
return count++;
}
// 深さ優先探索
void dfs(int n, int goal)
{
int x = path[n - 1];
if (x == goal)
{
print_path(n);
reliability(n);
tie_times();
}
else
{
for (int i = 0; i < M; i++)
{
int y = a[x][i];
if (y == 0) break;
if (!visited[y])
{
path[n] = y;
visited[y] = true;
dfs(n + 1, goal);
visited[y] = false;
}
}
}
}
int main(void)
{
printlist();
path[0] = A;
visited[A] = true;
dfs(1, G);
printf("タイセットの数 %d\n", tie_times());
printf("正常 %lf", arr[1]);
printf("正常 %lf", arr[2]);
printf("正常 %lf", arr[3]);
printf("正常 %lf", arr[4]);
printf("\n");
return 0;
}
Re: 配列から共通の文字を取り出したいです
提示されているコードは残念ながらあまり関係無さそうなので一旦消すか脇に置いて、
まずは処理対象の「配列1」と「配列2」を用意しましょう。
配列を用意したら、以下のような手順で計算をするといいでしょう。
(各配列の要素に、配列内での重複が無い場合) 配列内に重複した要素が存在しうる場合、まずは重複した要素をどう数えるかを定義するべきですね。
まずは処理対象の「配列1」と「配列2」を用意しましょう。
配列を用意したら、以下のような手順で計算をするといいでしょう。
(各配列の要素に、配列内での重複が無い場合) 配列内に重複した要素が存在しうる場合、まずは重複した要素をどう数えるかを定義するべきですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)