CCF201512-2 消除类游戏

本文探讨了如何避免复制粘贴代码,通过思路重新实现程序的相同部分。介绍了一种不使用额外存储的消除游戏策略,将待消除元素暂时变为负数,行和列标记后统一置为0。同时提到了使用memset()函数初始化数组的方法。
摘要由CSDN通过智能技术生成

对于程序中相似的几部分也不要复制粘贴,还是要按照思路走一遍。

#include<iostream>
using namespace std;

int chess[30][30];
int result[30][30];

int main()
{
	int n,m;
	cin>>n>>m;
	for (int i=0;i<n;i++)
	for (int j=0;j<m;j++)
		cin>>chess[i][j];
	for(int i=0;i<n;i++)
	for (int j=0;j<m;j++)
		result[i][j]=-1;	
		
	for(int i=0;i<n;i++)
	{
		for(int j=2;j<m;j++)
		{
			if(chess[i][j-2]==chess[i][j-1]&&chess[i][j-1]==chess[i][j])
			{
				result[i][j-2]=result[i][j-1]=result[i][j]=0;
			}
			else
			{
				for(int m=0;m<3;m++)
				{
					if(result[i][j-m]!=0)
					{
						result[i][j-m]=chess[i][j-m];
					}
				}
			
			}
		}	
	}
	
	for(int j=0;j<m;j++)
	for(int i=2;i<n;i++)  //for(int i=0;i<n;i++)就不对了,因为会数组溢出 
	{
		if(chess[i-2][j]==chess[i-1][j]&&chess[i-1][j]==chess[i][j])
			{
				result[i-2][j]=result[i-1][j]=result[i][j]=0;
			}
			else
			{
				for(int m=0;m<3;m++)
				{
					if(result[i-m][j]!=0)
					{
						result[i-m][j]=chess[i-m][j];
					}
				}
			
			}
	}
	
	for (int i=0;i<n;i++)
	{
		for (int j=0;j<m;j++)
			cout<<result[i][j]<<" ";
		cout<<endl; 
	}

	
	return 0;
}

还可以采用一种不使用额外存储的做法,需要消除的元素暂时将其值变为相反数(负数),等行和标记之后,再统一消除(置值)为0,最后输出结果。

使用函数memset()对数组进行初始化是套路。,memset(void *arr,int c,unsigned long size)是在<string.h>头文件


/* CCF201512-2 消除游戏 */

 

#include <iostream>

#include <cmath>

 

using namespace std;

 

const int N = 30;

 

int grid[N][N], n, m;

 

int main()

{

    // 输入数据

    cin >> n >> m;

    for(int i=0; i<n; i++)

        for(int j=0; j<m; j++) {

            cin >> grid[i][j];

        }

 

    // 进行行标记(可以消除则置为负)

    for(int i=0; i<n; i++)

        for(int j=0; j<m-2; j++) {

            if(abs(grid[i][j]) == abs(grid[i][j+1]) && abs(grid[i][j+1]) == abs(grid[i][j+2])) {

                if(grid[i][j] > 0)

                    grid[i][j] = - grid[i][j];

                if(grid[i][j+1] > 0)

                    grid[i][j+1] = - grid[i][j+1];

                if(grid[i][j+2] > 0)

                    grid[i][j+2] = - grid[i][j+2];

            }

        }

 

    // 进行列标记(可以消除则置为负)

    for(int j=0; j<m; j++)

        for(int i=0; i<n-2; i++) {

            if(abs(grid[i][j]) == abs(grid[i+1][j]) && abs(grid[i+1][j]) == abs(grid[i+2][j])) {

                if(grid[i][j] > 0)

                    grid[i][j] = - grid[i][j];

                if(grid[i+1][j] > 0)

                    grid[i+1][j] = - grid[i+1][j];

                if(grid[i+2][j] > 0)

                    grid[i+2][j] = - grid[i+2][j];

            }

        }

 

    // 进行清除(可以消除则置为0)并且输出结果

    for(int i=0; i<n; i++) {

        for(int j=0; j<m; j++) {

            if(grid[i][j] < 0)

                grid[i][j] = 0;

            if(j != 0)

                cout << " ";

            cout << grid[i][j];

        }

        cout << endl;

    }

 

    return 0;

}

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值