输出1到N 的子集并并保存到文件

#include <fstream>
#include <iostream>
#include <string>
#define N 6 //集合中元素的个数 元素为 1...N
using namespace std;
void WriteToFile(const char s[], const char fileName[])
{
    // 创建一个ofstream对象并打开一个文件
    ofstream fileOut(fileName,ios::app);
    if (fileOut.is_open()) {
        // 将数据写入文件
        fileOut << s;
        // 关闭文件
        fileOut.close();
    }

    return ;
}

void dfs(int depth,string s,int pos,int n)
{
    if (pos==n*2)
    {

        WriteToFile("{", "content.txt");
        WriteToFile(s.c_str(), "content.txt");
        WriteToFile("}\n", "content.txt");
        cout <<"{" << s <<"}" << endl;
        return;
    }
    if (depth >= N)
    {
        return;
    }
    dfs(depth + 1, s,pos,n);
    s[pos] = '1' + depth;
    if(pos < 2*n-2 )
    s[pos + 1] = ',';//偶数位为集合元素,奇数位为','
    dfs(depth + 1, s,pos+2,n);
    
}

int main() {
   
    cout << "{}" << endl;//空集情况
    WriteToFile("{}\n", "content.txt");
    for (int i = 1; i <= N; i++)
    {
        string s(i * 2 - 1, '0');
        dfs(0, s, 0, i);
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言实现ε-closure(I)的程序实现,已经注释了每个函数的作用。 ``` #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 20 // 状态集合的最大大小 int n; // 状态数 int m; // 字符数 int tran[MAX][MAX][MAX]; // 转移矩阵 int start; // 起始状态 int f[MAX]; // 结束状态集合 int cntf; // 结束状态数 int closure[MAX]; // 空闭包 int size; // 空闭包大小 // 初始化转移矩阵 void init() { memset(tran, -1, sizeof(tran)); } // 输入有限自动机 void input() { printf("请输入状态数和字符数:"); scanf("%d%d", &n, &m); printf("请输入转移关系:\n"); for (int i = 0; i < n; i++) { printf("请输入第%d个状态的转移关系:\n", i + 1); for (int j = 0; j < m; j++) { printf("请输入字符%d的转移状态:", j + 1); while (getchar() != '\n') continue; int k; scanf("%d", &k); if (k == -1) continue; tran[i][j][tran[i][j][MAX - 1]++] = k; } } printf("请输入起始状态:"); scanf("%d", &start); printf("请输入结束状态数:"); scanf("%d", &cntf); printf("请输入结束状态集合:"); for (int i = 0; i < cntf; i++) { scanf("%d", &f[i]); } } // 计算空闭包 void epsilon(int s) { closure[size++] = s; for (int i = 0; i < tran[s][m - 1][MAX - 1]; i++) { int t = tran[s][m - 1][i]; int flag = 0; for (int j = 0; j < size; j++) { if (closure[j] == t) { flag = 1; break; } } if (!flag) epsilon(t); } } // 计算状态集合的空闭包 void eclosure() { printf("请输入状态集合大小:"); int s; scanf("%d", &s); printf("请输入状态集合:"); int set[MAX]; for (int i = 0; i < s; i++) { scanf("%d", &set[i]); } // 计算每个状态的空闭包 for (int i = 0; i < s; i++) { epsilon(set[i]); } // 打印状态集合的空闭包 printf("状态集合的空闭包为:\n"); for (int i = 0; i < size; i++) { printf("%d ", closure[i]); } printf("\n"); } // 打印有限自动机 void output() { printf("有限自动机状态转换图:\n\n"); printf("digraph G {\n"); printf(" rankdir = LR;\n"); printf(" node [shape = circle];\n"); // 打印结点 for (int i = 0; i < n; i++) { printf(" %d", i); // 判断是否为起始状态 if (i == start) printf(" [style = filled, fillcolor = red]"); // 判断是否为结束状态 for (int j = 0; j < cntf; j++) { if (i == f[j]) { printf(" [style = filled, fillcolor = green]"); break; } } printf(";\n"); } // 打印边 for (int i = 0; i < n; i++) { for (int j = 0; j < m - 1; j++) { for (int k = 0; k < tran[i][j][MAX - 1]; k++) { int t = tran[i][j][k]; printf(" %d -> %d [label = \"%c\"];\n", i, t, j + 'a'); } } } printf("}\n"); } int main() { init(); input(); output(); eclosure(); return 0; } ``` 以上程序实现了输入任意给定的有限自动机,对该自动机的任意状态子集I,输出它的空闭包ε-closure(I)的功能。程序中包括输入有限自动机、计算空闭包、计算状态集合的空闭包、打印有限自动机等功能。运行程序时,先输入有限自动机的状态数和字符数,再输入转移关系,起始状态和结束状态集合等信息,即可得到有限自动机状态转换图并计算任意状态集合的空闭包。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值