fork download
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<math.h>
  4. int ninputs;
  5. int dfa [100][2][100] = {0};
  6. int state [10000] = {0};
  7. char ch [10], str [1000];
  8. int go [10000][2] = {0};
  9. int arr [10000] = {0};
  10. int main ()
  11. {
  12. int st, fin, in;
  13. int f [10];
  14. int i, j=3, s=0, final=0,flag=0,curr1,curr2,k,l;
  15. int c;
  16. printf ("\n follow the one based indexing\n");
  17. printf ("\n enter the number of states::");
  18. scanf ("%d", &st);
  19. printf ("\n give state numbers from 0 to %d", st-1);
  20. for (i=0; i<st; i++)
  21. state[(int) (pow (2, i))] = 1;
  22. printf ("\n enter number of final states\t");
  23. scanf ("%d", &fin);
  24. printf ("\n enter final states::");
  25. for (i=0; i<fin; i++)
  26. {
  27. scanf ("%d", &f[i]);
  28. }
  29. int p, q, r, rel;
  30. printf ("\n enter the number of rules according to nfa::");
  31. scanf ("%d", &rel);
  32. printf ("\n\n define transition rule as \n");
  33. for (i=0; i<rel ; i++)
  34. {
  35. scanf ("%d%d%d", &p,&q,&r);
  36. if (q==0)
  37. dfa[p][0][r] = 1;
  38. else
  39. dfa[p][1][r] = 1;
  40. }
  41. printf ("\n enter initial state::");
  42. scanf ("%d", &in);
  43. in = pow (2, in);
  44. i=0;
  45. printf ("\n solving according to dfa");
  46. int x=0;
  47. for (i=0; i<st; i++)
  48. {
  49. for (j=0; j<2; j++)
  50. {
  51. int stf=0;
  52. for (k=0; k<st; k++)
  53. {
  54. if (dfa [i][j][k] ==1)
  55. stf = stf + pow (2, k);
  56. }
  57. go[(int) (pow (2, i))][j] = stf;
  58. printf("%d-%d-->%d\n", (int) (pow (2, i)), j, stf);
  59. if(state[stf]==0)
  60. arr[x++] = stf;
  61. state[stf] = 1;
  62. }
  63. }
  64. //for new states
  65. for (i=0; i<x; i++)
  66. {
  67. printf ("for %d ----- ", arr[x]);
  68. for (j=0; j<2; j++)
  69. {
  70. int new=0;
  71. for (k=0; k<st; k++)
  72. {
  73. if(arr[i] & (1<<k))
  74. {
  75. int h = pow (2, k);
  76. if(new==0)
  77. new = go[h][j];
  78. new = new | (go[h][j]);
  79. }
  80. }
  81. if(state[new]==0)
  82. {
  83. arr[x++] = new;
  84. state[new] = 1;
  85. }
  86. }
  87. }
  88. printf ("\n the total number of distinct states are::\n");
  89. printf ("state 0 1\n");
  90. for (i=0; i<10000; i++)
  91. {
  92. if(state[i]==1)
  93. {
  94. //printf ("%d**", i);
  95. int y=0;
  96. if(i==0)
  97. printf ("q0 ");
  98. else
  99. for (j=0; j<st; j++)
  100. {
  101. int x = 1<<j;
  102. if (x& i)
  103. {
  104. printf ("q %d ", j);
  105. y = y+ pow (2, j);
  106. //printf ("y=%d ", y);
  107. }
  108. }
  109. //printf ("%d", y);
  110. printf (" %d %d", go[y][0], go[y][1]);
  111. printf("\n");
  112. }
  113. }
  114. j=3;
  115. while(j--)
  116. {
  117. printf ("\n enter string");
  118. scanf ("%s", str);
  119. l = strlen(str);
  120. curr1 = in;
  121. flag = 0;
  122. printf ("\n string takes the following path-->\n");
  123. printf ("%d-",curr1);
  124. for (i=0; i<l; i++)
  125. {
  126. curr1 = go[curr1] [str[i]-'0'];
  127. printf ("%d-", curr1);
  128. }
  129. printf ("\n final state - %d\n", curr1);
  130. for (i=0; i<fin; i++)
  131. {
  132. if (curr1 & (1<<f[i]))
  133. {
  134. flag = 1;
  135. break;
  136. }
  137. }
  138. if(flag)
  139. printf ("\n string accepted");
  140. else
  141. printf ("\n string rejected");
  142. }
  143. return 0;
  144. }
  145.  
Success #stdin #stdout 0.04s 25464KB
stdin
Standard input is empty
stdout
#include<stdio.h> 
#include<string.h> 
#include<math.h> 
int ninputs; 
int dfa [100][2][100] = {0}; 
int state [10000] = {0}; 
char ch [10], str [1000]; 
int go [10000][2] = {0}; 
int arr [10000] = {0}; 
int main () 
{ 
int st, fin, in; 
int f [10]; 
int i, j=3, s=0, final=0,flag=0,curr1,curr2,k,l; 
int c; 
printf ("\n follow the one based indexing\n"); 
printf ("\n enter the number of states::"); 
scanf ("%d", &st); 
printf ("\n give state numbers from 0 to %d", st-1); 
for (i=0; i<st; i++) 
state[(int) (pow (2, i))] = 1; 
printf ("\n enter number of final states\t"); 
scanf ("%d", &fin); 
printf ("\n enter final states::"); 
for (i=0; i<fin; i++) 
{ 
scanf ("%d", &f[i]); 
} 
int p, q, r, rel; 
printf ("\n enter the number of rules according to nfa::"); 
scanf ("%d", &rel); 
printf ("\n\n define transition rule as \n"); 
for (i=0; i<rel ; i++) 
{ 
scanf ("%d%d%d", &p,&q,&r); 
if (q==0) 
dfa[p][0][r] = 1; 
else 
dfa[p][1][r] = 1; 
} 
printf ("\n enter initial state::"); 
scanf ("%d", &in); 
in = pow (2, in); 
i=0; 
printf ("\n solving according to dfa"); 
int x=0; 
for (i=0; i<st; i++) 
{ 
for (j=0; j<2; j++) 
{ 
int stf=0; 
for (k=0; k<st; k++) 
{ 
if (dfa [i][j][k] ==1) 
stf = stf + pow (2, k); 
} 
go[(int) (pow (2, i))][j] = stf; 
printf("%d-%d-->%d\n", (int) (pow (2, i)), j, stf); 
if(state[stf]==0) 
arr[x++] = stf; 
state[stf] = 1; 
} 
} 
//for new states 
for (i=0; i<x; i++) 
{ 
printf ("for %d ----- ", arr[x]); 
for (j=0; j<2; j++) 
{ 
int new=0; 
for (k=0; k<st; k++) 
{ 
if(arr[i] & (1<<k)) 
{ 
int h = pow (2, k); 
if(new==0) 
new = go[h][j]; 
new = new | (go[h][j]); 
} 
} 
if(state[new]==0) 
{ 
arr[x++] = new; 
state[new] = 1; 
} 
} 
} 
printf ("\n the total number of distinct states are::\n"); 
printf ("state 0 1\n"); 
for (i=0; i<10000; i++) 
{ 
if(state[i]==1) 
{ 
//printf ("%d**", i); 
int y=0; 
if(i==0) 
printf ("q0 "); 
else 
for (j=0; j<st; j++) 
{ 
int x = 1<<j; 
if (x& i) 
{ 
printf ("q %d ", j); 
y = y+ pow (2, j); 
//printf ("y=%d ", y); 
} 
} 
//printf ("%d", y); 
printf (" %d %d", go[y][0], go[y][1]); 
printf("\n"); 
} 
} 
j=3; 
while(j--) 
{ 
printf ("\n enter string"); 
scanf ("%s", str); 
l = strlen(str); 
curr1 = in; 
flag = 0; 
printf ("\n string takes the following path-->\n"); 
printf ("%d-",curr1); 
for (i=0; i<l; i++) 
{ 
curr1 = go[curr1] [str[i]-'0']; 
printf ("%d-", curr1); 
} 
printf ("\n final state - %d\n", curr1); 
for (i=0; i<fin; i++) 
{ 
if (curr1 & (1<<f[i])) 
{ 
flag = 1; 
break; 
} 
} 
if(flag) 
printf ("\n string accepted"); 
else 
printf ("\n string rejected"); 
} 
return 0; 
}