| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1397 人关注过本帖
标题:[清理垃圾帖子]
只看楼主 加入收藏
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
回复 10楼 BlueGuy
额、我是按照平时做题的格式写的,没写过实际项目,自己感觉还是能看吧。。
2012-02-18 17:53
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 11楼 czz5242199
// 消除地图上的方块
   public static int[][] removeTiles()
   {
       int[][] a =
          {
              {7, 7, 3,  4,  5}, // {0, 1, 0, 0, 0}
              {2, 7, 7,  7, 10}, // {0, 1, 1, 1, 0}
              {7, 7, 7, 14, 15}, // {1, 1, 1, 0, 0}
              {7, 7, 7, 7, 7}    // {1, 1, 1, 1, 1}
          };
      
       int[][] b = new int[MAP_HEIGHT][MAP_WIDTH];

       // 判断地图的橫向
       for (int i = 0; i < MAP_HEIGHT; i++)
       {
           for (int j = 0; j < MAP_WIDTH; )
           {
               int runLength = 0;
               int runValue = a[i][j];
               
               while ((j + runLength < MAP_WIDTH) && (a[i][j+runLength] == runValue))
               {
                   runLength++;
               }
               
               if (runLength >= 3)
               {
                   for (int k = 0; k < runLength; k++)
                   {
                       b[i][j+k] = 1;
                   }
               }
               
               j = j + runLength;
           }
       }
      
       // 判断地图的纵向
       for (int i = 0; i < MAP_WIDTH; i++)
       {
           for (int j = 0; j < MAP_HEIGHT; )
           {
               int runLength = 0;
               int runValue = a[j][i];
               
               while ((j + runLength < MAP_HEIGHT) && (a[j+runLength][i] == runValue))
               {
                   runLength++;
               }
               
               if (runLength >= 3)
               {
                   for (int k = 0; k < runLength; k++)
                   {
                       b[j+k][i] = 1;
                   }
               }
               
               j = j + runLength;
           }
       }
      
       // 消除方块
       for (int i = 0; i < MAP_HEIGHT; i++)
       {
           for (int j = 0; j < MAP_WIDTH; j++)
           {
               if (b[i][j] == 1)
               {
                   if (i == 0)
                   {
                       a[i][j] = -1;
                   }
                   else
                   {   
                       for (int k = i; k > 0; k--)
                       {
                           a[k][j] = a[k-1][j];
                       }
                       
                       a[0][j] = -1;
                   }
               }
           }
       }
      
       return a;
   }

[ 本帖最后由 BlueGuy 于 2012-2-18 18:45 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2012-02-18 18:00
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
应该可以的,反正标记随便写都行,至于合并感觉有点麻烦,就这样可以啊
2012-02-18 18:06
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 9楼 beyondyf
能帮我改改最后那一段吗?

我就是真命天子,顺我者生,逆我者死!
2012-02-18 18:11
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
你这不是C或C++代码吧?倒像是C#的。你希望我用什么语言写呢?

重剑无锋,大巧不工
2012-02-18 19:03
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
嗯?已解决了,没看见。每个人的思路不同。下面我写了一个通用的函数。很容易修改为各种语言。

程序代码:
#include<stdio.h>
////
//map : 待检测数组,函数将直接按条件修改此数组
//width : map的宽
//height : map的高
//condition : 修改条件,函数将对在行或列上大于等于条件的连续值赋为-1
////
void removeTiles(int * map, int width, int height, int condition)
{
    int * mark, i, j, k, map_index;
    mark = (int *)malloc(width * height * sizeof(int));
    for(i = 0; i < height; i++)
    for(j = 0; j < width; j++)
    {
        map_index = i * width + j;
        mark[map_index] = 1;
        for(k = i - 1; k >= 0 && map[map_index] == map[k * width + j]; k--) mark[map_index]++; //检测上侧
        for(k = i + 1; k < height && map[map_index] == map[k * width + j]; k++) mark[map_index]++; //检测下侧
        if(mark[map_index] >= condition) continue;
        mark[map_index] = 1;
        for(k = j - 1; k >= 0 && map[map_index] == map[map_index - j + k]; k--) mark[map_index]++; //检测左侧
        for(k = j + 1; k < width && map[map_index] == map[map_index - j + k]; k++) mark[map_index]++; //检测右侧
    }
   
    for(i = 0, j = width * height; i < j; i++)
        if(mark[i] >= condition) map[i] = -1;
    free(mark);
}

int main()
{
    int a[4][5] = {
    {7, 7, 3, 4, 5},
    {2, 7, 7, 7, 10},
    {7, 7, 7, 14, 15},
    {7, 7, 7, 7, 7}
    };
    int i, j;
    removeTiles(a[0], 5, 4, 3);
    for(i = 0; i < 4; i++, putchar('\n'))
    for(j = 0; j < 5; j++) printf("%5d", a[i][j]);
    return 0;
}

重剑无锋,大巧不工
2012-02-18 19:20
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 15楼 beyondyf
偶尔也客串一下 java

我就是真命天子,顺我者生,逆我者死!
2012-02-18 19:24
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
那就更方便了。上面函数可以直接传入数组对象,不需要将二维数组当作一维来处理,width, height参数也可以省去了。

重剑无锋,大巧不工
2012-02-18 19:28
罗世斌
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-4-12
收藏
得分:0 
memset(b,0,sizeof(b));是啥意思
2012-04-13 21:19
罗世斌
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-4-12
收藏
得分:0 
16楼少了#include<malloc>头文件了
2012-04-13 21:24
快速回复:[清理垃圾帖子]
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020050 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved