2 u013086938 u013086938 于 2016.02.16 10:33 提问

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

题目是:
用任意编程语言实现,关于《三消除宝石类游戏》的匹配算法
地图用一个二维数组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();
                    ![图片说明](http://img.ask.csdn.net/upload/201602/16/1455589915_978931.png)

5个回答

u013086938
u013086938   2016.02.16 10:37

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

q3733353520
q3733353520   2016.02.16 14:19

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

u013086938
u013086938 我尝试了一下设定临时变量去记录相同数字数目的做法,但是没有写出来,被数组下标和循环条件纠缠了整整一下午。如果您方便的话,能请您再详细教我一下写法或者思路吗?
接近 2 年之前 回复
u013643920
u013643920   2016.02.16 14:26

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

u013643920
u013643920 嗯,加油!
接近 2 年之前 回复
u013086938
u013086938 回复keloli: 做出来了~谢谢您~
接近 2 年之前 回复
u013643920
u013643920 for语句里面可以控制啊,n从0到列数减三不就保证不越界了吗?而且也把这一行遍历完了。
接近 2 年之前 回复
u013086938
u013086938 还是不太懂...要如何判断连续3个下标相同呢?比如 if (map[m, n] == map[m, n+1]) 的时候,map[m, n+1]下标会出界啊...是不是我写法错了...
接近 2 年之前 回复
q3733353520
q3733353520   2016.02.16 17:55
 #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();
}
u013086938
u013086938 回复linux_liyi: 做出来了~谢谢您的提示~
接近 2 年之前 回复
q3733353520
q3733353520 回复入间人间: 当某一格为0时,让本列其上面的所有数字都向下移,从下往上判断,最后把空出来的格子用随机产生的数字填上
接近 2 年之前 回复
u013086938
u013086938 谢谢您的解答!我还有一处不懂,比如一个5×5大小的数组,其中有一列,第一个元素和最后一个元素是数字3,中间第2、3、4位都是0。这时用怎样的算法能实现“把顶部的3下降到底部3上面呢?”,0是占位用的,自己交换位置自己赋值为0也可以。感谢您!请您指教!
接近 2 年之前 回复
WinsenJiansbomber
WinsenJiansbomber   2016.03.06 23:33

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!