HDUoj2214

来源:互联网 发布:中电数据服务有限公司 编辑:程序博客网 时间:2024/06/06 01:02
百度了下,好像没人写2214的解题报告~~我来试下╮(╯_╰)╭暑假这么久就做一题哎,凑合吧。

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2214


说真的,这题的输出格式真……,x那一列没空格,结果第一次PE了,然后看了别人的讨论,空白处输出不是空格,改了‘~’就WA,坑,纠结了好久,把多余的空格去了,终于过了。 
 其实这道题不难,就是麻烦(不同线段要弄在同一幅图还要字母不同,察)一开始没看清题目,以为一个函数一幅图像(输出样例的b太少,果断被我忽略了 ),后来改得有点凄凉~~难怪没多少人提交,还是蛮有成就感的 
代码:

#include<iostream>#include<cstring>using namespace std;short a[6],b[6];short tu[62][62];int sum;int main(){    short n,len,i,j,m,t,z,T;char shi[30];    int mid,F,num=0;    while(cin>>n)    {    num++;    for(i=0;i<62;i++)        for(j=0;j<62;j++)        tu[i][j]=0;    for(T=1;T<=n;T++)    {        cin>>shi;        len=strlen(shi);        m=0;sum=0;        for(i=2,t=0;i<len;i++)        {            if(shi[i]!='+'&&shi[i]!='-'&&i!=len-1)t++;            else            {                if(i==len-1){t++;i++;}                if(t==1)                {                    if(shi[i-1]!='x')                    {                        if(shi[i-2]=='-')sum+='0'-shi[i-1];                        else sum+=shi[i-1]-'0';                    }                    else                    {                        if(shi[i-2]=='-')a[m]=-1;                        else a[m]=1;                        b[m++]=1;                    }                }                if(t==2)                {                    if(shi[i-3]=='-')a[m]='0'-shi[i-2];                    else a[m]=shi[i-2]-'0';                    b[m++]=1;                }                if(t==3)                {                    if(shi[i-4]=='-')a[m]=-1;                    else a[m]=1;                    b[m++]=shi[i-1]-'0';                }                if(t==4)                {                    if(shi[i-5]=='-')a[m]='0'-shi[i-4];                    else a[m]=shi[i-4]-'0';                    b[m++]=shi[i-1]-'0';                }                t=0;            }        }        for(i=-30;i<=30;i++)            {                mid=0;F=sum;                for(t=0;t<m;t++)                {                    mid=a[t];                    for(z=0;z<b[t];z++)                        mid*=i;                    F+=mid;                }                if(F<=30&&F>=-30)                    {                        if(tu[i+30][F+30]==0)tu[i+30][F+30]=T;                        else tu[i+30][F+30]=-1;                    }            }    }    cout<<"Case:"<<num<<endl;    for(i=-31;i<=30;i++)    {        for(j=-30;j<=31;j++)        {            if(j==31)            {                if(i==0)cout<<'>';                if(i==1)cout<<'x';                continue;            }            if(i==-31)            {                if(j==-1)cout<<'y';                if(j==0)cout<<'^';                if(j!=-1&&j!=0)cout<<' ';                continue;            }            if(tu[j+30][30-i])            {                if(i==0||j==0||tu[j+30][30-i]==-1)cout<<'.';                else cout<<char(tu[j+30][30-i]+'a'-1);                continue;            }            if(i==0||j==0)            {                if(i==0&&j==0)cout<<'+';                else                {                    if(i==0)cout<<'-';                    else cout<<'|';                }                continue;            }            cout<<' ';        }        cout<<endl;    }    }}

思路很简单。
①根据运算符+-间的间隔长度不同来判断系数和指数分别是多少,用a[]储存系数,b[]储存指数。
②枚举x∈[-30,30]满足式子的点,即算出来的y∈[-30,30] ,因为下标不能为负,所以+30。不满足的点为0,满足的点令tu[][]=相应的T,如果已存在,则令tu[][]=-1,表示重合。
③输出就OK了。
图像很粗糙,但蛮好玩的。 

0 0