Problem:Cow Art

本文介绍了一个编程问题,涉及奶牛对颜色的感知。挑战是计算在不同视角(人类和奶牛)下,一幅N×N网格画作中颜色区域的数量。奶牛无法区分红色和绿色。提供了一个示例输入和输出,并指出解决方案是一种简单的搜索算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem:Cow Art

Description
一个有关奶牛的鲜为人知的事实是她们都是红绿色盲,也就是说,在她们看来,红色和绿色是一样的(译者注:奶牛把这种颜色称作“红绿色”)。这使得我们设计的艺术作品难以同时符合人类和奶牛的审美口味。考虑一个由N x N格字符表示的方形绘画作品,其中每个字符为R(红),G(绿)或者B(蓝)一幅绘画如果有许多互不相同的着色“区域”,则我们认为它是有趣的。如果两个字符是直接相邻的(一个在另一个的东、南、西、北方向)且其表示的颜色相同,则这两个字符属于同一个区域。例如,下面这幅绘画作品:

RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

如果由人类来看有4个区域(2个红色,1个蓝色和1个绿色区域),而如果由奶牛来看则只有3个区域(2个红绿色,1个蓝色区域)。现给你一副绘画作为输入,请计算该作品由人类和奶牛来看分别有多少个区域。
Input
第1行:整数N。
第2,1+N行:每行包含一个长度为N的字符串,表示绘画作品的一行。

Output
第1行:两个空格隔开的整数,分别给出由人类和奶牛欣赏绘画作品时会看见多少个区域。

Sample Input
5
RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

Sample Output
4 3

重点的内容我给大家加黑了,它就是一道简单的搜索,分两次,人和奶牛(好无聊的题啊),所以应该这样搜索,代码理解:

#include<bits/stdc++.h>//可爱的万能头
using namespace std;
const int maxdep=10;
const int INF=0x7fffffff;//这个是无限大(备注一下)
int dep,found,fm[10],ans[10];
int g(int a,int b)
{
 return b?g(b,a%b):a;//好像是绝对值(我记得应该是)
}
void dfs(int a,int b,int k)
{
 if(k==dep+1) return;//如果超了返回
 if(b%a==0&&b/a>fm[k-1])
 {
  fm[k]=b/a;//存储
  if(!found||ans[k]>fm[k])
     memcpy(ans,fm,sizeof(fm));//复制一个给另外的看
  found=1;
  return;
 }
 int s=b/a;
 if(s<=fm[k-1])
   s=fm[k-1]+1;
 int t=(dep-k+1)*b/a;
 if(t>INF/b)
   t=INF/b;
 for(int i=s;i<=t;i++)
 {
  fm[k]=i;
  int d=g(a*i-b,b*i);
  dfs((a*i-b)/d,(b*i)/d,k+1);//继续搜索
 }
}
int main()
{
 fm[0]=1;
 found=0;
 int a,b;
 cin>>a>>b;
 for(dep=1;dep<=maxdep;dep++)
 {
  dfs(a,b,1);
  if(found)//判断
  {
   for(int j=1;j<=dep;j++)
   {
    cout<<ans[j];
    if(j!=dep) cout<<" ";//输出
   }
   break;
  }
 }//好像又忘了打return 0;
}

今天不想讲大道理了,大家都懂:

#include<bits/stdc++.h>
using namespace std;
const int maxdep=10;
const int INF=0x7fffffff;
int dep,found,fm[10],ans[10];
int g(int a,int b)
{
 return b?g(b,a%b):a;
}
void dfs(int a,int b,int k)
{
 if(k==dep+1) return;
 if(b%a==0&&b/a>fm[k-1])
 {
  fm[k]=b/a;
  if(!found||ans[k]>fm[k])
     memcpy(ans,fm,sizeof(fm));
  found=1;
  return;
 }
 int s=b/a;
 if(s<=fm[k-1])
   s=fm[k-1]+1;
 int t=(dep-k+1)*b/a;
 if(t>INF/b)
   t=INF/b;
 for(int i=s;i<=t;i++)
 {
  fm[k]=i;
  int d=g(a*i-b,b*i);
  dfs((a*i-b)/d,(b*i)/d,k+1);
 }
}
int main()
{
 fm[0]=1;
 found=0;
 int a,b;
 cin>>a>>b;
 for(dep=1;dep<=maxdep;dep++)
 {
  dfs(a,b,1);
  if(found)
  {
   for(int j=1;j<=dep;j++)
   {
    cout<<ans[j];
    if(j!=dep) cout<<" ";
   }
   break;
  }
 }
}

爱你们哦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值