CodeForces - 1059B - Forgery

这道CodeForces的1059B问题要求在给定的签名基础上,通过改变空白纸张上的特定点来复原签名。如果一个点周围8个点都是'#'字符,那么在空白纸上该点需要被操作。关键在于确定需要改动的点,并进行相应操作。最终判断复原的签名是否与原始签名相同。

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

题目链接: Forgery

题目大意:

就是给你一张已经没法改动的签名,也就是你自己输入的那个方格,其中 '#'代表字迹,现在给你一张同样大小的空白纸,让你去操作(当你操作一个点时,这个点本身不变,他周围的八个点会变为‘#’),问能不能操作数次之后变成你输入的那个方格样式。

题目思路

思路就是,需要你改动的地方,卯了劲去改,不能改的地方就别乱动。那么关键就是什么地方需要我们去操作呢?当某一个点周围的八个点都是‘#’,那么我们就应该在那张空白纸上去操作这个点,当全部操作完毕,看看你输入的那个方格和你操作的那个方格是否一致就行。

#include <bits/stdc++.h>
using namespace std;
char a[1001][1001],c[1001][1001];
int judge(int x,int y)              // 判断函数
{
    if(a[x][y-1]=='#' && a[x][y+1]=='#' && a[x-1][y]=='#' && a[x-1][y-1]=='#'  && a[x-1][y+1]=='#' && a[x+1][y-1]=='#' && a[x+1][y]=='#' && a[x+1][y+1]=='#')
        return 1;
    else
        return 0;
}
void turnover(int x,int y)
{                                             //操作函数
   c[x][y-1]='#';
   c[x][y+1]='#';
   c[x-1][y]='#';
   c[x-1][y-1]='#';
   c[x-1][y+1]='#';
   c[x+1][y-1]='#';
   c[x+1][y]='#';
   c[x+1][y+1]='#';
}
int main()
{
   int n,m,flag,i,j;
   cin>>n>>m;
   flag=0;
   for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
   {
       cin>>a[i][j];
       c[i][j]='.';
   }
   for(i=1;i<=n;i++)                             //看看此方格是否需要操作
    for(j=1;j<=m;j++)
   {
       if(i!=1 && i!=n &&  j!=1 && j!=m && judge(i,j))
        turnover(i,j);
   }
   for(i=1;i<=n;i++)                          //判断两个方格是否一致
    for(j=1;j<=m;j++)
    if(c[i][j]!=a[i][j])
   {
       flag=1;
       break;
   }
   if(flag)
    cout<<"NO"<<endl;
   else
    cout<<"YES"<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值