• 【NOI OJ】1818 红与黑


    1818:红与黑


    总时间限制: 
    1000ms 
    内存限制: 
    65536kB
    描述
    有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
    输入
    包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下
    1)‘.’:黑色的瓷砖;
    2)‘#’:白色的瓷砖;
    3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
    当在一行中读入的是两个零时,表示输入结束。
    输出
    对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。
    样例输入
    6 9 
    ....#. 
    .....# 
    ...... 
    ...... 
    ...... 
    ...... 
    ...... 
    #@...# 
    .#..#. 
    0 0
    
    样例输出
    45
    
    来源
    1979

    #--------------------------------------------------------------------------------#

    还是一道DFS的深搜题,主体思路:
    找到“@”后,进入函数,上下左右搜索,if(跑出数组||撞墙)便return
    递归一次便sum++
    相信基本上算是深搜十分简单的题。。。

    看看原代码:
    #include<cstdio>
    #include<cstring>
    char a[22][22];
    int w,h;
    int maxn;
    void r(int x,int y,int sum)
    {
    	if(x<0||y<0||x==h||y==w||a[x][y]=='#')
    		return;
    	a[x][y]='#';
    	r(x+1,y,sum+1);
    	r(x-1,y,sum+1);
    	r(x,y-1,sum+1);
    	r(x,y+1,sum+1);
    	if(sum>maxn)
    		maxn=sum;
    }
    int main()
    {
    	while(1)
    	{
    		scanf("%d%d
    ",&w,&h);
    		if(w==0&&h==0)
    			return 0;
    		int x,y;
    		for(int i=0;i<h;i++)
    		{
    			for(int j=0;j<w;j++)
    			{
    				scanf("%c",&a[i][j]);
    				if(a[i][j]=='@')
    				{
    					x=i;
    					y=j;
    				}
    			}
    			getchar();
    		}
    		r(x,y,1);
    		printf("%d
    ",maxn);
    		memset(a,'',sizeof(a));
    	}
    	return 0;
    }


    但是!!!
    wrong了!!
    why?
    why?
    why?

    在请ac的同学看看后,顿时无语……
    再看看题:
    请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
    我呢……

    if(sum>maxn)
    	maxn=sum;

    算的是最大!!!

    欲哭无泪……
    于是果断删掉此段:

    #include<cstdio>
    #include<cstring>
    char a[22][22];
    int w,h;
    int sum;
    void r(int x,int y)
    {
    	if(x<0||y<0||x==h||y==w||a[x][y]=='#')
    		return;
    	sum++;
    	a[x][y]='#';
    	r(x+1,y);
    	r(x-1,y);
    	r(x,y-1);
    	r(x,y+1);
    }
    int main()
    {
    	while(1)
    	{
    		scanf("%d%d",&w,&h);
    		if(w==0&&h==0)
    			return 0;
    		int x,y;
    		getchar();
    		for(int i=0;i<h;i++)
    			scanf("%s",a[i]);
    		for(int i=0;i<h;i++)
    			for(int j=0;j<w;j++)
    				if(a[i][j]=='@')
    				{
    					x=i;
    					y=j;
    					break;
    				}
    		r(x,y);
    		printf("%d
    ",sum);
    		memset(a,'',sizeof(a));
    	}
    	return 0;
    }



    还是wrong了!
    为什么……

    找找找
    调调调

    发现了!!!直接吐……

    看看修改后的:

    <span style="font-size:18px;">#include<cstdio>
    #include<cstring>
    char a[22][22];
    int w,h;
    int sum;
    void r(int x,int y)
    {
    	if(x<0||y<0||x==h||y==w||a[x][y]=='#')
    		return;
    	sum++;
    	a[x][y]='#';
    	r(x+1,y);
    	r(x-1,y);
    	r(x,y-1);
    	r(x,y+1);
    }
    int main()
    {
    	while(1)
    	{
    		scanf("%d%d",&w,&h);
    		if(w==0&&h==0)
    			return 0;
    		int x,y;
    		getchar();
    		for(int i=0;i<h;i++)
    			scanf("%s",a[i]);
    		for(int i=0;i<h;i++)
    			for(int j=0;j<w;j++)
    				if(a[i][j]=='@')
    				{
    					x=i;
    					y=j;
    					break;
    				}
    		r(x,y);
    		printf("%d
    ",sum);
    		memset(a,'',sizeof(a));
    		sum=0;
    	}
    	return 0;
    }</span>

    发现了吗

    sum=0;

    归零!

    归零!

    归零!

    再交一遍

    Accepted了!!

    总结一下,一共两点:
    1.认真读题!

    2.有多组测试数据时sum,ans等变量要清零

                                                                                                                                                            
                                                                                   By WZY

  • 相关阅读:
    Bootstrap<基础十四> 按钮下拉菜单
    Bootstrap<基础十三> 按钮组
    Bootstrap <基础十二>下拉菜单(Dropdowns)
    Bootstrap<基础十一>字体图标(Glyphicons)
    Bootstrap<基础十> 响应式实用工具
    Bootstrap<基础九>辅助类
    Bootstrap <基础八>图片
    Bootstrap <基础七>按钮
    Bootstrap<基础六> 表单
    Bootstrap <基础五>表格
  • 原文地址:https://www.cnblogs.com/LinqiongTaoist/p/7203777.html
Copyright © 2020-2023  润新知