CCF CSP 201512-2 消除类游戏(C++) 递归方法

在这里插入图片描述
在这里插入图片描述
结果是正确的,但是超时了,1.062s,只有50分,目前不知道怎么在递归的前提下优化,大家可以提提建议,网上的都是常规做法,这里用递归算是提供一种新思路

#include <iostream>
using namespace std;
int direct[5][2]= {{0,1},{1,0}};//列  行
const int N=100;
const int M=100;
int a[N][M];
int n,m;
int flag[N][M]={0};
void Clean(int i,int j)
{
    if(i>n||j>m)return;
    if(i<n-2&&a[i][j]==a[i+1][j]&&a[i][j]==a[i+2][j])//先判断列有没有三个
    {
        flag[i][j]=1;
        flag[i+1][j]=1;
        flag[i+2][j]=1;
    }
    if(j<m-2&&a[i][j]==a[i][j+1]&&a[i][j]==a[i][j+2])//再判断行有没有三个
    {
        flag[i][j]=1;
        flag[i][j+1]=1;
        flag[i][j+2]=1;
    }
    for(int k=0; k<2; ++k) //递归处理右下2个周边坐标
        Clean(i+direct[k][0],j+direct[k][1]);//先列再行
}
int main()
{
    cin>>n>>m;
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            cin>>a[i][j];
    int i=0,j=0;
    Clean(i,j);
        for(i=0; i<n; i++)
    {
        for( j=0; j<m; j++)
        {
            if(flag[i][j]==1)
                a[i][j]=0;
            cout << a[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值