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

问题描述

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

题目是:
用任意编程语言实现,关于《三消除宝石类游戏》的匹配算法
地图用一个二维数组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)

解决方案

求助后面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();
}

解决方案五:

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

时间: 2024-09-28 01:24:23

三消-求助!关于二维数组相邻数字的判断的相关文章

求助一道二维数组交换特定元素位置的算法题,谢谢大家!

问题描述 求助一道二维数组交换特定元素位置的算法题,谢谢大家! 刚试验了一下出了新问题- - 比如,一开始是左边的数组,我想"把2个0去掉,然后0上面的2就掉下来了",形成右边的新数组 然后我用了循环遍历,比如只看第二列,我的做法是"从下往上找,遇到0,就和0上面的数字交换",结果成了下面这个样子了- - 我有个改进想法是"还是从下往上找,遇到0之后判断上面的是不是0,如果是0,再继续向上再找,直到不是0,然后把这个数赋值给一开始那个0的位置",

求助-数据结构二维数组问题

问题描述 数据结构二维数组问题 设二维数组A[1...m,1...n]按行存储在数组B中,则二维数组元素A[i,j]在一维数组B中的下标为() A.n*(i-1)+j B.n*(i-1)+j-1 C.i*(j-1) D.j*m+i-1 答案是A,想知道具体的做法和计算过程,谢谢了 解决方案 m行n列,每行有n个,下标(i,j),就是第i行从左至右第j个的位置,而从第一到第i-1行每行都有n个,已经有n*(i-1)个,所以再加上第i行的j就是了 解决方案二: 二维数组作为参数传递问题 解决方案三:

2013级C++第15周项目——二维数组

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目1-折腾二维数组]创建一个长度为5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后通过键盘输入,使后两列的10个元素获得值,将所有元素值乘以3后保存在数组中.输出数组时,按行序优先输出,再按列序优先输出(输出的第一行是数组中的第一列--,其实输出的就是"转置"),再将数组"倒"着输出(即最后一行最后一列的最先输

2014秋C++ 第14周项目 二维数组

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目1-折腾二维数组]创建一个5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后: 通过键盘输入,使后两列的10个元素获得值: 按行序优先输出数组元素: 将所有元素值乘以3后保存在数组中: 按列序优先输出(输出的第一行是数组中的第一列--,其实输出的就是"

《C语言及程序设计》实践项目——二维数组与指针

返回:贺老师课程教学链接 [项目1-二维数组当函数参数]定义一个函数来完成对参数数组中元素的求和工作,函数声明如下: int sum(int array[ ][4],int m,int n); //该函数完成对array数组中的前m行和n列元素求和 在以下程序的基础上,完成对sum函数的定义. #include <stdio.h> int sum(int array[ ][4],int m,int n);//该函数完成对array数组中的前m行和n列元素求和 int main() { int

[剑指Offer]5.二维数组中的查找

题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路 [算法系列之三十三]杨氏矩阵 代码 /*--------------------------------------- * 日期:2015-07-19 * 作者:SJF0115 * 题目: 5.二维数组中的查找 * 网址:http://www.nowcoder.com/books/coding-interviews/a

二维数组中的查找概述

这一题给跪,c++死活超时...后来main函数改成用c就好了... 算法: /* 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数. 输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字.

c语言-C语言二维数组下标越界--却能给越界的下标赋值 和输出

问题描述 C语言二维数组下标越界--却能给越界的下标赋值 和输出 编译器:dev-c++ int iArray[3][4]; iArray[3][4]=1000; printf("%d",iArray[3][4]); 改变 iArray[3][4]的值为1000 输出的结果仍然为1000 请问这个是什么原因呢? 我是直接给越界的下标进行了赋值 以前以为只要是下标越界了 输出的都是无意义的数字 其实那是因为没有给越界的下标赋值 对吗 越界的下标为什么还能正常使用呀 解决方案 使用越界的数

有一个关于整型指针二维数组的问题

问题描述 有一个关于整型指针二维数组的问题 int x[4][4]y[4][4]z=0o=0;//z表示的是当前矩阵中的非零数字的数量,z为16则说明数字排满了,本局输了 //o表示最大数字的值,本例设定的是1024typedef int row[4]; //row代表具有4个元素的整型数组row p=x *q=y;//P是整型指针数组,有4组,每组有4个元素.p[1]=x[1]=(x+1) 这是别人写的2048源码的一部分,想问一下,这里为什么要先定义一个有4个元素的整型数组,然后再用这个去定