求助!关于二维数组相邻数字的判断

题目是:
用任意编程语言实现,关于《三消除宝石类游戏》的匹配算法
地图用一个二维数组map[m][n]表示

问题有3个:
1.随机填入1到4的数字到map,表示4种不同的宝石,格式化打印出地图内容,让地图内容肉眼可读。
【这道我写出来了,用的2个for循环】
2. 计算出符合条件的格子(横着或者竖着连续三个或三个以上相同)消除掉后的地图变化 ,消除掉宝石的空格子设置成0,格式化打印地图。
【这道不会】
3. 计算宝石下落,填满空格子后的地图变化(最上方一排格子可以随机生成宝石), 格式化打印地图。
【这道也不会..】

第一题我是这样写的:
//输入行数和列数
Console.WriteLine("请输入行数");
int rowNum = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入列数");
int colNum = Convert.ToInt32(Console.ReadLine());
//Console.WriteLine("行数:{0},列数:{1}",rowNum , colNum);
Console.WriteLine("");

        //定义二维数组map[rowNum][colNum]
        int[,] map = new int[rowNum, colNum];

        //为二维数组map赋值
        Random r = new Random();
        for (int m = 0; m < rowNum; m++)
        {
            for (int n = 0; n < colNum; n++)
            {                    
                int diaNum = r.Next(1, 5);
                map[m, n] = diaNum;
                Console.Write(map[m, n] + " ");
            }
            Console.WriteLine();
        }
        Console.ReadKey();
                    ![图片说明](https://img-ask.csdn.net/upload/201602/16/1455589915_978931.png)

求助后面2问的做法!谢谢大家!

定义一个flag初始化为0,先横着遍历,若后一个和前一个相同则flag++,然后判断flag>=3并且当前格子和前一格子不相同的话就把要消除的flag项的下标
记录到另一个数组当中,并把flag置为0。然后竖着遍历一次,最后一次性消除(即置零)。因为可能横竖有相交项。

第二问:暴力求解的话就是要索引求组下标,看三个元素是否相同。比如斜着的就是map[i][j],map[i+1][j+1],map[i+2][j+2],写一个判断条件判断是否相同,同时做个标记。
第三问:利用第二问的标记,把上面的元素向下移到相应的位置。

 #include <stdio.h>
#include <time.h>

int map[10][10];
int flag = 0;
int empty[10][10]={0};

#define row 10
#define col 10

void print_map()
{
    int i,j;

    for(i=0; i<row; i++)
    {
        for(j=0; j<col; j++)
        {
            printf("%d ", map[i][j]);
        }
        putchar(10);
    }
}

void init_map()
{
    int i,j;
    srand( (unsigned)time( NULL ) ); 

    for(i=0; i<row; i++)
    {
        for(j=0; j<col; j++)
        {
            map[i][j] = (rand()%3) + 1; 
        }
    }
}

void clear()
{
    int i,j;
    for(i=0; i<row; i++)
    {
        for(j=0; j<col; j++)
        {
            if(empty[i][j] == 1)
                map[i][j]=0;
        }
    }
}

void find_row_clear()
{
    int i,j,s,t;

    for(i=0; i<row; i++)
    {
        for(j=0; j<col; j++)
        {
            if(j==0)
            {
                if(flag >= 2)
                {
                    s=i-1;
                    t=9;
                    flag+=1;
                    while(flag--)
                    {
                        empty[s][t]=1;
                        if(t>0)
                            t--;
                    }   
                }
                flag=0;
            }else{

                if(map[i][j] == map[i][j-1])
                {       
                    flag++;
                }else if(map[i][j] != map[i][j-1] && flag < 2)
                {

                    flag=0;
                }else if(map[i][j] != map[i][j-1] && flag >= 2)
                {
                    s=i;
                    t=j-1;
                    flag+=1;
                    while(flag--)
                    {
                        empty[s][t]=1;
                        if(t>0)
                            t--;
                    }
                    flag=0;
                }
            }       
        }
    }
}

void find_col_clear()
{
    int i,j,s,t;

    for(i=0; i<row; i++)
    {
        for(j=0; j<col; j++)
        {
            if(i==0)
            {
                if(flag >= 2)
                {
                    s=9;
                    t=i-1;
                    flag+=1;
                    while(flag--)
                    {
                        empty[s][t]=1;
                        if(t>0)
                            s--;
                    }   
                }
                flag = 0;
            }
            else
            { 
                if(map[j][i] == map[j-1][i])
                {   
                    flag++;
                }else if(map[j][i] != map[j-1][i] && flag < 2)
                {
                    flag=0;
                }else if(map[j][i] != map[j-1][i] && flag >= 2)
                {
                    s=j-1;
                    t=i;
                    flag+=1;
                    while(flag--)
                    {       
                        empty[s][t]=1;
                        if(t>0)
                            s--;                
                    }
                    flag = 0;
                }
            }   
        }
    }
}

int main()
{

    init_map();

    print_map();

    find_row_clear();
    find_col_clear();
    clear();
    printf("=================================================\n");
    print_map();
}

这种动态的情景需要使用定时器去刷新数组的状态,使用专用的函数来绘制界面,使用专用的函数一处理数组及相应的消去规则。