zoukankan      html  css  js  c++  java
  • UVA297 四分树 Quadtrees 题解

    题目链接:

    https://www.luogu.org/problemnew/show/UVA297

    附几道推荐题目(先完成再食用此题效果更佳)

    https://www.luogu.org/problemnew/show/UVA122

    https://www.luogu.org/problemnew/show/UVA699

    https://www.luogu.org/problemnew/show/UVA839

    分析:

    本题为树上的递归题目。我们可以在一个子函数search中完成:

    void search(int x,int y,int w)
    

    其中x为当前准备判断像素的正方形的最小x坐标,y同理,w为正方形的边长。


    每次判断一个字符,如果是灰色,那么继续往下递归:

    if(tmp=='p')
    	{
    		search(x+w/2,y+w/2,w/2);
    		search(x+w/2,y,w/2);
    		search(x,y,w/2);
    		search(x,y+w/2,w/2);
    	}
    	因为每次灰色后都再次切成四块,所以说每次w要除以2
    

    否则,就是黑或白,白不用管,只把黑色的像素填上:

    else
    	{
    		if(tmp=='f')
    		{
    			for(int i=x;i<x+w;i++)
    			{
    				for(int j=y;j<y+w;j++)
    				{
    					a[i][j]=1;
    				}
    			}
    		}
    

    这些就是本题的核心部分,还有就是要注意输入输出,初始化等等,在此就不赘述了。

    代码:

    #include<cstdio>
    #include<cstring>
    #include<string> 
    #include<iostream>
    using namespace std;
    int cnt=-1;
    char s[1005];
    int a[33][33];
    void search(int x,int y,int w)
    {
    	char tmp=s[++cnt];
    	if(tmp=='p')
    	{
    		//if(num==1)
    		search(x+w/2,y+w/2,w/2);
    		//else
    		//if(num==2)
    		search(x+w/2,y,w/2);
    		//else
    		//if(num==3)
    		search(x,y,w/2);
    		//else
    		//if(num==4)
    		search(x,y+w/2,w/2);
    	}
    	else
    	{
    		if(tmp=='f')
    		{
    			//printf("%d %d %d %d
    ",xl,yl,xr,yr);
    			for(int i=x;i<x+w;i++)
    			{
    				for(int j=y;j<y+w;j++)
    				{
    					a[i][j]=1;
    				}
    			}
    		}
    		/*if(num==1)
    		search(xr*2,yr*2,xr,yr,num+1);
    		else
    		if(num==2)
    		search(xl,yr*2,xr*2,yr,num+1);
    		else
    		if(num==3)
    		search(xl,yl,xr*2,yr*2,num+1);
    		else
    		if(num==4)
    		search(xr*2,yl,xr,yr*2,num+1); */
    		//search(xl,yl,xr,yr,num+1);
    	}
    	 
    }
    int main()
    {
    	int T;
    	scanf("%d
    ",&T);
    	while(T--)
    	{
    		cnt=-1;
    		memset(a,0,sizeof(a));
    		int ans=0;
    		cin>>s;
    		search(0,0,32);
    		cnt=-1;
    		cin>>s;
    		search(0,0,32);
    		for(int i=0;i<=32;i++)
    		{
    			for(int j=0;j<=32;j++)
    			{
    				if(a[i][j]==1)
    				ans++;
    			}
    		}
    		printf("There are %d black pixels.
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    Oracle配置手册
    Vim配置手册
    高斯消元
    dp专场的蒟蒻题解
    mac 软件意外退出
    spring security整体流程
    服务启动shell脚本
    nohup 启动命令
    linux service脚本
    docker 安装prometheus和grafna
  • 原文地址:https://www.cnblogs.com/ShineEternal/p/10834248.html
Copyright © 2011-2022 走看看