#include <stdio.
h>
#include <stdlib.h>
#include <string.h>
#define MAX 10
int n;
char states[MAX][MAX];
int eclosure[MAX][MAX];
char symbols[] = "0123456789abcdefghijklmnopqrstuvwxyz";
int numSymbols;
void closure(int state, int visited[]) {
visited[state] = 1;
for (int j = 0; j < n; j++) {
if ((states[state][j] == 'e' || states[state][j] == 'E') &&
!visited[j]) {
closure(j, visited);
}
}
}
int main() {
int finalStates[MAX] = {0};
int startState;
printf("Enter number of states: ");
scanf("%d", &n);
printf("Enter start state (0 to %d): ", n - 1);
scanf("%d", &startState);
int numFinal;
printf("Enter number of final states: ");
scanf("%d", &numFinal);
printf("Enter final states: ");
for (int i = 0; i < numFinal; i++) {
int f;
scanf("%d", &f);
finalStates[f] = 1;
}
printf("\nEnter the transition table:\n");
printf("(use 'e' for epsilon, '-' for no transition, other chars for
symbols like 0/1)\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("From q%d to q%d: ", i, j);
scanf(" %c", &states[i][j]);
}
}
printf("\nOriginal Transition Table:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%c ", states[i][j]);
}
printf("\n");
}
memset(eclosure, 0, sizeof(eclosure));
for (int start = 0; start < n; start++) {
int visited[MAX] = {0};
closure(start, visited);
for (int i = 0; i < n; i++) {
eclosure[start][i] = visited[i];
}
}
printf("\nEpsilon-closures:\n");
for (int i = 0; i < n; i++) {
printf("E-closure(q%d): { ", i);
for (int j = 0; j < n; j++) {
if (eclosure[i][j]) printf("q%d ", j);
}
printf("}\n");
}
numSymbols = strlen(symbols);
int newTrans[MAX][numSymbols][MAX];
memset(newTrans, 0, sizeof(newTrans));
for (int s = 0; s < n; s++) {
for (int si = 0; si < numSymbols; si++) {
char sym = symbols[si];
int reach[MAX] = {0};
for (int c = 0; c < n; c++) {
if (eclosure[s][c]) {
for (int t = 0; t < n; t++) {
if (states[c][t] == sym) {
for (int z = 0; z < n; z++) {
if (eclosure[t][z]) reach[z] = 1;
}
}
}
}
}
for (int r = 0; r < n; r++) {
if (reach[r]) newTrans[s][si][r] = 1;
}
}
}
printf("\nCorrected NFA Transition Table (without epsilon):\n");
printf(" |");
for (int si = 0; si < numSymbols; si++) {
int hasTransition = 0;
for(int s = 0; s < n; s++){
for(int d = 0; d < n; d++){
if(newTrans[s][si][d]){
hasTransition = 1;
break;
}
}
if(hasTransition) break;
}
if(hasTransition) printf(" %c |", symbols[si]);
}
printf("\n--------+");
for (int si = 0; si < numSymbols; si++) {
int hasTransition = 0;
for(int s = 0; s < n; s++){
for(int d = 0; d < n; d++){
if(newTrans[s][si][d]){
hasTransition = 1;
break;
}
}
if(hasTransition) break;
}
if(hasTransition) printf("--------+");
}
printf("\n");
for (int s = 0; s < n; s++) {
if (s == startState) printf("->");
else printf(" ");
int isFinal = 0;
for(int i=0; i<n; ++i){
if(eclosure[s][i] && finalStates[i]){
isFinal = 1;
break;
}
}
if (isFinal) printf("*");
else printf(" ");
printf("q%-3d |", s);
for (int si = 0; si < numSymbols; si++) {
int hasTransition = 0;
for(int s_check = 0; s_check < n; s_check++){
for(int d = 0; d < n; d++){
if(newTrans[s_check][si][d]){
hasTransition = 1;
break;
}
}
if(hasTransition) break;
}
if(!hasTransition) continue;
printf(" {");
int empty = 1;
int first = 1;
for (int dest = 0; dest < n; dest++) {
if (newTrans[s][si][dest]) {
if(!first) printf(",");
printf("q%d", dest);
empty = 0;
first = 0;
}
}
if (empty) printf("- ");
printf("} |",-7);
}
printf("\n");
}
return 0;
}