SRM 550 DIV2

 

 

250pt

题意:

给定两个只有两种字符组成的字符串,把一个字符变成另一个字符称为一次变换,求是否能从第一个字符串经过k次变换后变成第二个字符串。

 

分析:

首先求出至少需要多少次变换m,若k不小于mkm的差是偶数(1个字符通过两次变换后值不变),则能,否则不能. 

View Code
class EasyConversionMachine 
{ 
        public: 
        string isItPossible(string ow, string fw, int k) 
        { 
                int i,j,n=ow.size();
                for(i=j=0;i<n;i++)
                    if(ow[i]!=fw[i])
                        j++;
                if(k>=j&&(k-j)%2==0)
                    return "POSSIBLE";
                return "IMPOSSIBLE";
        } 
        
 
}; 

 

 

500pt

题意:

在一个长宽未知的网格图里,一个机器人开始面朝东方,两个移动规则:

1,它会一直往前走直到碰到墙壁或已经走过的格子,之后会往左转。

2,重复1直到停止。

给定一个机器人的移动步数序列,求面积最小的网格图

 

分析:

因为序列数和步长都小于50,直接模拟,之后再求出已访问过的格点的行和列的最小值和最大值,差即为所求长和宽的值,构造网格图的边界,再验证每步步长是否符合规则1

 

View Code
class RotatingBot 
{ 
        public: 
        int minArea(vector <int> a) 
        {
            bool map[150][150]={false};
            int i,j,k,t,li,lj,ri,rj,v,n=a.size();
            int d[4][2]={{0,1},{-1,0},{0,-1},{1,0}};

            map[60][60]=true;
            for(k=t=0,i=j=60;k<n;k++)
            {
                for(v=0;v<a[k];v++)
                {
                    i+=d[t][0];
                    j+=d[t][1];
                    if(map[i][j])
                        return -1;
                    map[i][j]=true;
                }
                t=(t+1)%4;
            }
            li=lj=111;
            ri=rj=0;
            for(i=0;i<150;i++)
                for(j=0;j<150;j++)
                    if(map[i][j])
                    {
                        if(i<li)
                            li=i;
                        if(i>ri)
                            ri=i;
                        if(j<lj)
                            lj=j;
                        if(j>rj)
                            rj=j;
                    }
            int w=rj-lj+1,h=ri-li+1;

            memset(map,false,sizeof(map));
            map[60][60]=true;
            for(i=li-1,j=lj;j<=rj;j++)
                map[li-1][j]=map[ri+1][j]=true;
            for(i=li;i<=ri;i++)
                map[i][lj-1]=map[i][rj+1]=true;
            //for(i=li-1;i<=ri+1;i++,puts(""))
            //    for(j=lj-1;j<=rj+1;j++)
            //        printf("%d ",map[i][j]?1:0);
            for(k=t=0,i=j=60;k<n;k++)
            {
                for(v=0;;v++)
                {
                    i+=d[t][0];
                    j+=d[t][1];
                    if(map[i][j])
                    {
                        i-=d[t][0];
                        j-=d[t][1];
                        break;
                    }
                    map[i][j]=true;
                }
                if(k+1<n&&v!=a[k])
                    return -1;
                t=(t+1)%4;
            }
            return w*h;
        } 
        

}; 

 

 

1000pt

题意:

给定至多62个颜色唯一的矩形,把它们按照一定顺序放到网格图内,后放的矩形会覆盖前面所放的,所有矩形都没有被完全覆盖,求矩形的放置顺序(若有多个解,字典序最小)

 

分析:

看了半天,终于看出是拓扑排序。

覆盖是单向关系,即只能是后放的覆盖已放的,这种关系和拓扑很类似,解又是一个顺序,很容易想到是拓扑排序。

  先求出每个矩形长和宽的至少值(与500分题行和列最小值和最大值的求法相同),再求它被哪些矩形所覆盖,构造拓扑边,剩下的就是拓扑排序了。

View Code
char L[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

class TopView 
{ 
        public:
        int toVex(char c)
        {
            int k;
            for(k=0;L[k]!=c;k++);
            return k;
        }
        string findOrder(vector <string> grid) 
        {
            bool covered[66][66],has[66]={false},flag=true;
            string ret;
            int i,j,k,li,lj,ri,rj,n,m,v,w,to[66];
            memset(covered,0,sizeof(covered));
            memset(to,0,sizeof(to));
            n=grid.size();
            m=grid[0].size();
            for(v=0;v<62;v++)
            {
                li=lj=100;
                ri=rj=0;
                for(i=0;i<n;i++)
                {
                    for(j=0;j<m;j++)
                        if(grid[i][j]==L[v])
                        {
                            li=min(li,i);
                            ri=max(ri,i);
                            lj=min(lj,j);
                            rj=max(rj,j);
                        }
                }
                for(i=li;i<=ri;i++)
                    for(j=lj;j<=rj;j++)
                    {
                        has[v]=true;
                        if(grid[i][j]=='.')
                            return "ERROR!";
                        w=toVex(grid[i][j]);
                        if(v!=w)
                            covered[v][w]=true;
                    }
            }
            for(v=0;v<62;v++)
                for(w=0;w<62;w++)
                    if(covered[v][w])
                        to[w]++;
            for(;flag;)
            {
                flag=false;
                for(v=0;v<62;v++)
                    if(has[v]&&to[v]==0)
                    {
                        flag=true;
                        has[v]=false;
                        ret.push_back(L[v]);
                        for(w=0;w<62;w++)
                            if(covered[v][w])
                                to[w]--;
                        break;
                    }
            }
            for(v=0;v<62;v++)
                if(has[v])
                    return "ERROR!";
            return ret;
        } 
        
 
}; 

 

posted @ 2012-07-29 14:02    阅读(239)  评论(0编辑  收藏  举报