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;
        } 
        
 
}; 

 

转载于:https://www.cnblogs.com/xchaos/archive/2012/07/29/2613990.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值