计算理论导引实验 NFA转DFA
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HUNAN UNIVERSITY
计算理论导引实验报告
题目:NFA转换为DFA 学生姓名:
学生学号:
专业班级:计算机科学与技术
上课老师:
实验日期:
一、实验目的 (2)
二、实验方法.......................................................................................... 错误!未定义书签。
三、实验代码.......................................................................................... 错误!未定义书签。
四、测试数据以及运行结果 (5)
一、实验目的
•将一个给定的NFA转换为一个完全等价的DFA。
二、实验方法
编写一个算法/程序,将一个给定的NFA转换为一个完全等价的DFA 三、实验代码
#include
#include
#include
#include
#include
using namespace std;
int ans[65536];
int one[65536];
int zero[65536];
int lft[65536];
int rgt[65536];
int change[65536];
bool vis[65536];
bool ac[65536];
int cnt, n, q, f;
void init()
{
}
int getlow(int p)
{
return p&(-p);
}
int getloc(int p)
{
int x = 1;
if(p == 1)
return 0;
int i = 0;
while(++i)
{
x <<= 1;
if(p == x)
return i;
}
return 0;
}
int mege(int a, int b)
{
while(b)
{
int x = getlow(b);
if(!(a&x))
a ^= x;
b ^= x;
}
return a;
}
void dfs(int p)
{
ans[cnt] = p;
int lsum = 0, rsum = 0;
while(p)
{
int x = getlow(p);
int y = getloc(x);
lsum = mege(lsum, zero[y]);
rsum = mege(rsum, one[y]);
p ^= x;
}
lft[cnt] = lsum;
rgt[cnt] = rsum;
cnt++;
if(!vis[lsum])
vis[lsum] = 1, dfs(lsum);
if(!vis[rsum])
vis[rsum] = 1, dfs(rsum);
}
int main()
{
init();
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d%d%d", &n, &q, &f);
for(int i = 0; i < n; i++)
scanf("%d", &zero[i]);
for(int i = 0; i < n; i++)
scanf("%d", &one[i]);
cnt = 0;
memset(vis, 0, sizeof(vis));
memset(ac, 0, sizeof(ac));
vis[q] = 1;
dfs(q);
int sum = 0;
for(int i = 0; i < cnt; i++)
if(ans[i]&f)
ac[i] = 1, sum++;
for(int i = 0; i < cnt; i++)
change[ans[i]] = i;
printf("%d %d %d\n", cnt, sum, 0);
for(int i = 0, j = 0; i < cnt; i++)
{
if(ac[i])
{
if(j)
printf(" ");
printf("%d", i);
j++;
}
}
printf("\n");
for(int i = 0; i < cnt; i++)
{
if(i)
printf(" ");
printf("%d", change[lft[i]]);
}
printf("\n");
for(int i = 0; i < cnt; i++)
{
if(i)
printf(" ");
printf("%d", change[rgt[i]]);
}
printf("\n");
}
return 0;
}