⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00130004.txt

📁 1.逻辑电路图中至多有100行
💻 TXT
字号:
 Welcome To Administrator's Page of Judge Online of ACM ICPC, Peking University
  


--------------------------------------------------------------------------------

Source

Problem Id:1048  User Id:00130004 
Memory:76K  Time:10MS 
Language:C  Result:Accepted

Source 
#include<stdio.h> 
#include<stdlib.h> 
int state[100][100],value[26],row,column,done; 
char logic[100][100]; 

void hdsearch(int x,int y) 
{ 
    int dir,ish; 
    void process(int x,int y); 
    if(done)return; 
    dir=-1;ish=1; 
    while(!done) 
    { 
        if(logic[x][y]>='A'&&logic[x][y]<='Z') 
            process(x,y); 
        else switch(logic[x][y]) 
        { 
            case '-': 
            case 'o': 
            case ':': 
            case '\\': 
            case '/': 
                y=y+dir; 
                break; 
            case '|': 
                x+=dir; 
                break; 
            case ')': 
            case '>': 
                if(state[x-1][y-1]==-1) 
                {x--;y--;} 
                else if(state[x+1][y-1]==-1) 
                {x++;y--;} 
                else  
                { 
                    if(logic[x][y]==')') 
                        state[x][y]=state[x-1][y]&state[x+1][y]; 
                    else 
                        state[x][y]=state[x-1][y]|state[x+1][y]; 
                    process(x,y); 
                } 
                break; 
            case '+': 
                if(ish) 
                { 
                    if(x<row-1&&logic[x+1][y]=='|') 
                        dir=1; 
                    else 
                        dir=-1; 
                    ish=0; 
                    x+=dir; 
                } 
                else 
                { 
                    if(y<column-1&&logic[x][y+1]=='-') 
                        dir=1; 
                    else 
                        dir=-1; 
                    ish=1; 
                    y+=dir; 
                } 
                break; 
        } 
    } 
    return; 
} 

void process(int x,int y) 
{ 
    int dir,ish; 
    void hdsearch(int x,int y); 
    if(done)return; 
    if(logic[x][y]>='A'&&logic[x][y]<='Z') 
    { 
        state[x][y]=value[logic[x][y]-'A']; 
        if(y<column-1&&logic[x][y+1]=='-') 
        { 
            ish=1; 
            dir=1; 
            y++; 
            state[x][y]=state[x][y-1]; 
        } 
        else if(y>0&&logic[x][y-1]=='-') 
        { 
            ish=1; 
            dir=-1; 
            y--; 
            state[x][y]=state[x][y+1]; 
        } 
        else if(x<row-1&&logic[x+1][y]=='|') 
        { 
            ish=0; 
            dir=1; 
            x++; 
            state[x][y]=state[x-1][y]; 
        } 
        else if(x>0&&logic[x-1][y]=='|') 
        { 
            ish=0; 
            dir=-1; 
            x--; 
            state[x][y]=state[x+1][y]; 
        } 
    } 
    else 
    { 
        ish=1; 
        dir=1; 
    } 
    while(!done) 
    { 
        switch(logic[x][y]) 
        { 
            case '-': 
            case ':': 
            case ')': 
            case '>': 
                y+=dir; 
                state[x][y]=state[x][y-dir]; 
                break; 
            case 'o': 
                y+=dir; 
                state[x][y]=state[x][y-dir]^1; 
                break; 
            case '|': 
                x+=dir; 
                state[x][y]=state[x-dir][y]; 
                break; 
            case '\\': 
                if(state[x+2][y]==-1) 
                    hdsearch(x+2,y); 
                else 
                { 
                    x++; 
                    y++; 
                    if(logic[x][y]==')') 
                        state[x][y]=state[x-1][y-1]&state[x+1][y-1]; 
                    else 
                        state[x][y]=state[x-1][y-1]|state[x+1][y-1]; 
                } 
                break; 
            case '/': 
                if(state[x-2][y]==-1) 
                    hdsearch(x-2,y); 
                else 
                { 
                    x--; 
                    y++; 
                    if(logic[x][y]==')') 
                        state[x][y]=state[x-1][y-1]&state[x+1][y-1]; 
                    else 
                        state[x][y]=state[x-1][y-1]|state[x+1][y-1]; 
                } 
                break; 
            case '+': 
                if(ish) 
                { 
                    if(x<row-1&&logic[x+1][y]=='|') 
                        dir=1; 
                    else 
                        dir=-1; 
                    ish=0; 
                    x+=dir; 
                    state[x][y]=state[x-dir][y]; 
                } 
                else 
                { 
                    if(y<column-1&&logic[x][y+1]=='-') 
                        dir=1; 
                    else 
                        dir=-1; 
                    ish=1; 
                    y+=dir; 
                    state[x][y]=state[x][y-dir]; 
                } 
                break; 
            case '?': 
                printf("%d\n",state[x][y]); 
                done=1; 
                break; 
        } 
    } 
    return; 
} 

main() 
{ 
    int i,j,flag; 
    char c; 
    while(scanf("%c",&c)==1) 
    { 
        column=0; 
        for(i=0;(i>0?(c=getchar()):1)&&c!='*';i++) 
        { 
            if(c=='\n'){i--;continue;} 
            logic[i][0]=c; 
            for(j=1;(c=getchar())!='\n';j++) 
            { 
                logic[i][j]=c; 
            } 
            if(j>column) 
                column=j; 
            for(;j<100;j++) 
                logic[i][j]=' '; 
        } 
        c=getchar(); 
        while(c=='\n')c=getchar(); 
        row=i; 
        while(c!='*') 
        { 
            if(c=='\n')continue; 
            value[0]=c-'0'; 
            for(i=1;i<26;i++) 
            { 
                value[i]=getchar(); 
                value[i]-='0'; 
            } 
            c=getchar(); 
            for(i=0;i<row;i++) 
                for(j=0;j<column;j++) 
                    state[i][j]=-1; 
            flag=0; 
            for(j=0;j<column&&!flag;j++) 
                for(i=0;i<row;i++) 
                    if(logic[i][j]>='A'&&logic[i][j]<='Z') 
                    {flag=1;break;} 
            done=0; 
            process(i,j-1); 
            c=getchar(); 
        } 
        printf("\n"); 
        c=getchar(); 
    } 
    exit(0); 
} 

 Admin's Home Page 



--------------------------------------------------------------------------------

All Copyright Reserved 2003
Any problem, Please Contact Administrator

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -