CCF 201512-2 消除类游戏

思路:
1. 查看第一行有没有连续三个同样的数,有的话开始计数,直到数字不同为止。此时把找到的结果(格式为(起点数字的所在行、起点数字所在列、长度))压入一个向量(vector)。继续从下一个数字开始找。比如第一行数字是: 1 1 1 1 2 2 2,那么会把(0,0,4),(0,1,3),(0,4,3)压入向量。
2. 上面一种情况是有三个连续的数字相同的,若没有三个连续的数字相同,直接看本行的下一个数字
3. 用同样的方法查找列,压入另一个向量
4. 根据向量的数据,把相应的数字设为 0,当然可能有的数字被设为 0 后再次被设为 0,但结果一样。
代码如下:

#include <iostream>
#include <vector>
using namespace std;

struct record  //记录一串消去的数字的第一个数字所在位置和消去的数字个数 
{
    int row;  
    int col;
    int len;

    record(int r=0, int c=0, int l=0):row(r),col(c), len(l){}
};

int main()
{
    int n, m;
    int a[30][30];      //保存输入的矩阵 
    vector<record> rowr;
    vector<record> colr;

    //freopen("t4.txt", "r", stdin);
    cin>>n>>m;
    for(int i=0; i<n*m; i++) cin>>a[i/m][i%m];

    if(n <3 && m<3)    //如果矩阵行列数均小于3,那直接输出就可以了 
    {
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
                cout<<a[i][j]<<" ";
            cout<<endl;
        }
        return 0;
    }


    else
    {
        int nn = n-3, mm = m-3;
        int len(0);
        for(int i=0; i<n; i++)     //行遍历 
            for(int j=0; j<= mm; ) //每行数字遍历 ,注意用 mm 控制不超过边界 
            {
                len = 0; 
                if(a[i][j] == a[i][j+1] && a[i][j+1] == a[i][j+2]) //如果连续三个数相等 
                {
                    while((j + len < m) && (a[i][j+len] == a[i][j]))
                        ++len;
                    rowr.push_back(record(i, j, len));
                    ++j; 
                }   
                else
                    ++j;
            }

        for(int i=0; i<m; i++)    //列遍历 
            for(int j=0; j<= nn; )
            {
                len = 0;
                if(a[j][i] == a[j+1][i] && a[j+1][i] == a[j+2][i])
                {
                    while(j + len < n && a[j+len][i] == a[j][i])
                        ++len;
                    colr.push_back(record(j, i, len));
                    ++j;
                }
                else
                    ++j;
            }

        for(int k=0; k<rowr.size(); k++) //消行中的相同数字 
        {
            int ii = rowr[k].row, jj = rowr[k].col, le = rowr[k].len;
            for(int j=0; j<le; j++)
                a[ii][jj+j] = 0; 
        }       

        for(int k=0; k<colr.size(); k++) //消列中的相同数字 
        {
            int ii = colr[k].row, jj = colr[k].col, le = colr[k].len;
            for(int i=0; i<le; i++)
                a[ii+i][jj] = 0;
        }
    }

    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
            cout<<a[i][j]<<" ";
        cout<<endl; 
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/gengli2017/article/details/82219599