用JAVA编出一个细胞自动机的程序,跪求大神帮助!

用JAVA编出一个细胞自动机的程序,跪求大神帮助!,第1张

public class Model {

Integer a[]

Integer b[]

Integer rule[]

Integer TIME_MAX = 41

Integer NUM_OF_CELL = 41

public Model() {

a = new Integer[NUM_OF_CELL]

b = new Integer[NUM_OF_CELL]

rule = new Integer[8]

rule[0] = 0

rule[1] = 1

rule[2] = 1

rule[3] = 0

rule[4] = 1

rule[5] = 1

rule[6] = 0

rule[7] = 0

for (int i = 0i <NUM_OF_CELLi++) {

a[i] = 0

}

a[NUM_OF_CELL / 2] = 1

}

public static void main(String[] args) {

Model sm = new Model ()

sm.doIt()

}

private void doIt() {

String str = ""

for (int t = 0t <TIME_MAXt++) {

for (int i = 0i <NUM_OF_CELLi++) {

b[i] = function(a[(NUM_OF_CELL + i - 1) % NUM_OF_CELL],a[i],a[(i + 1) % NUM_OF_CELL])

if (a[i] == 0) {

str = "#"

} else {

str = "*"

}

System.out.print(str + " ")

}

System.out.println("")

for (int j = 0j <NUM_OF_CELLj++) {

a[j] = b[j]

}

}

}

private Integer function(Integer i1, Integer i2, Integer i3) {

if (i1 == 0 &i2 == 0 &i3 == 0) {

return rule[0]

}

if (i1 == 0 &i2 == 0 &i3 == 1) {

return rule[1]

}

if (i1 == 0 &i2 == 1 &i3 == 0) {

return rule[2]

}

if (i1 == 0 &i2 == 1 &i3 == 1) {

return rule[3]

}

if (i1 == 1 &i2 == 0 &i3 == 0) {

return rule[4]

}

if (i1 == 1 &i2 == 0 &i3 == 1) {

return rule[5]

}

if (i1 == 1 &i2 == 1 &i3 == 0) {

return rule[6]

}

if (i1 == 1 &i2 == 1 &i3 == 1) {

return rule[7]

}

return 0

}

}

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define edge(_) ((_) - 'a')

struct Node { int isEnd struct Node *tr[26] }

struct Node mc[100]

int main()

{

    mc[0].tr[edge('a')] = mc + 1

    mc[0].tr[edge('b')] = mc + 2

    mc[1].tr[edge('a')] = mc + 3

    mc[1].tr[edge('b')] = mc + 2

    mc[2].tr[edge('a')] = mc + 1

    mc[2].tr[edge('b')] = mc + 3

    mc[3].tr[edge('a')] = mc[3].tr[edge('b')] = mc + 3

    mc[3].isEnd = 1

    char buff[256]

    while(gets(buff))

    {

        int i, curr = 0, len = strlen(buff)

        for(i = 0 i < len ++i)

        {

            if(mc[curr].tr[edge(buff[i])] != NULL)

            {

                curr = mc[curr].tr[edge(buff[i])] - mc

            }

            else break

        }

        printf(mc[curr].isEnd == 1 ? "Accept\n" : "Refuse\n")

    }

    return 0

}

#include"stdio.h"

#include"string.h"

char a[20][10]

char Vn[26]

char Vt[64]

int M=0 //Vn下标

int N=0 //Vt下标

int m=0

int flag=-1 //又穷状态自动机是确定与非确定的标志

void initial() //初始化

{

for(int b=0b<26b++)

Vn[b]='#'

for(int c=0c<64c++)

Vt[c]='#'

for(int d=0d<20d++)

for(int e=0e<10e++)

a[d][e]='#'

}

void group()//判断终结符号与非终结符

{

for(int k=0a[k][0]!='e'k++)

{

for(int f=0a[k][f]!='\0'f++)

{

if((a[k][f]>='A')&&(a[k][f]<='Z'))

{

for(int x=0x<=M&&M<=27x++)

if(Vn[x]==a[k][f])

break

if((x-1)==M)

{

Vn[M]=a[k][f]

M++

}

}

else

{

for(int y=0y<=N&&N<=20y++)

{

if(a[k][f]==':'||a[k][f]=='=')

break

else

{

if(Vt[y]==a[k][f])

break

}

}

if((y-1)==N)

{

Vt[N]=a[k][f]

N++

}

}

}

}

}

void input() //输入文法

{

for(int i=0i<10i++)

a[m][i]='#'

scanf("%s",a[m])

while(strcmp(a[m],"end"))

{

if((a[m][0]>='A')&&(a[m][0]<='Z')) //判断是否为正则文法

{

int h=4

if((a[m][h]>='A')&&(a[m][h]<='Z'))//U::=WT

{

if((a[m][h+1]<'A')||(a[m][h+1]>'Z'))

{

if(a[m][h+2]!='\0')

{

printf("此规则不是正则文法的规则,请重新输入\n")

input()

break

}

}

else

{

printf("此规则不是正则文法的规则,请重新输入\n")

input()

break

}

}

else

{

if(a[m][h+1]!='\0')//U::=T

{

printf("此规则不是正则文法的规则,请重新输入\n")

input()

break

}

}

}

m++

scanf("%s",a[m])

}

}

void recongnise() //判断是确定还是非确定

{

for(int i=0a[i][0]!='e'i++)

{

for(int j=i+1a[j][0]!='e'j++)

{

int n=4

if(a[i][n]==a[j][n])

n++

if(a[i][n]==a[j][n])

break

}

int h=4

if(a[i][h]==a[j][h])

h++

if(a[i][h]==a[j][h]) //U::=T

{

printf("此文法对应的有穷状态自动机是非确定的\n\n")

flag=0

break

}

}

if(a[i][0]=='e') //U::=WT

{

printf("此文法对应的有穷状态自动机是确定的\n\n")

flag=1

}

}

void output() //输出文法相应的有穷状态自动机

{

if(flag==0)

{

printf("NFA N=({")

for(int i=0Vn[i]!='#'i++)

printf("%c,",Vn[i])

printf("S},{")

for(int j=0Vt[j]!='#'j++)

printf("%c,",Vt[j])

printf("},M',{S},{%c})\n",Vn[0])

printf("其中M':\n")

for(int x=0Vn[x]!='#'x++)

{

for(int y=0Vt[y]!='#'y++)

{

printf("M'(%c,%c)=",Vn[x],Vt[y])

for(int z=0a[z][0]!='e'z++)

if(a[z][4]==Vn[x])

if(a[z][5]==Vt[y])

printf("%c",a[z][0])

if(a[z][0]=='e')

printf("\t")

}

printf("\n")

}

for(int u=0Vt[u]!='#'u++)

{

printf("M'(S,%c)=",Vt[u])

for(int k=0a[k][0]!='e'k++)

if(a[k][4]==Vt[u])

printf("%c",a[k][0])

if(a[k][0]=='e')

printf("\t")

}

}

if(flag==1)

{

printf("DFA N=({")

for(int b=0Vn[b]!='#'b++)

printf("%c,",Vn[b])

printf("S},{")

for(int c=0Vt[c]!='#'c++)

printf("%c,",Vt[c])

printf("},M',S,{%c})\n",Vn[0])

printf("其中M':\n")

for(int p=0Vn[p]!='#'p++)

{

for(int q=0Vt[q]!='#'q++)

for(int r=0a[r][0]!='#'r++)

if(a[r][4]==Vn[p])

if(a[r][5]==Vt[q])

printf("M'(%c,%c)=%c\t",Vn[p],Vt[q],a[r][0])

printf("\n")

}

for(int d=0Vt[d]!='#'d++)

{

for(int e=0a[e][0]!='e'e++)

if(a[e][4]==Vt[d])

printf("M'(S,%c)=%c\t",Vt[d],a[e][0])

}

}

}

void main()

{

initial()

printf("请输入文法:\n")

input()

group()

printf("\n")

recongnise()

output()

printf("\n")

}

输入的是形如U::=T和U::=WT这种类型的正则文法,没有U::=TW这种文法的输入。这个程序基本上齐全,如果输入的文法不是正则文法,会给出提示重新输入的。祝君好运,记得给分哦!!!!这可是花了一周才写出来的,而且输出的状态自动机是按非终结符号的顺序输出的,而不是按文法的顺序输出,绝对达标。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12169415.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存