问题描述
- 求助!关于二维数组相邻数字的判断
-
题目是:
用任意编程语言实现,关于《三消除宝石类游戏》的匹配算法
地图用一个二维数组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();
}
解决方案五:
这种动态的情景需要使用定时器去刷新数组的状态,使用专用的函数来绘制界面,使用专用的函数一处理数组及相应的消去规则。