鱼C论坛

 找回密码
 立即注册
查看: 1192|回复: 10

[已解决]该如何选出一个二维数组中相同的数呢

[复制链接]
发表于 2019-11-8 23:17:12 | 显示全部楼层 |阅读模式
3鱼币
该怎么选出一个二位数组中的相同的书呢,比如这样一个二位数组,我该怎么选出所有相邻而且相等的数呢,然后把相同的换成0;类似消消乐游戏那样
2 2 3 1 2
3 1 1 1 1
2 3 2 1 3
2 2 3 3 3
输出是这样的
2 2 3 0 2
3 0 0 0 0
2 3 2 0 3
2 2 0 0 0
最佳答案
2019-11-8 23:17:13
本帖最后由 jackz007 于 2019-11-10 00:32 编辑
zmLau0727 发表于 2019-11-10 00:02
这个还是有点问题啊,按照题目要求这个第9行的1和第11行的1也得被替换成0


        现在再看呢?

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.         int d[4][5] = {{2 , 2 , 3 , 1 , 2} ,\
  5.                        {3 , 1 , 1 , 1 , 1} ,\
  6.                        {2 , 3 , 2 , 1 , 3} ,\
  7.                        {2 , 2 , 3 , 3 , 3}}                                         ;
  8.         int c , e[4][5] , i , j , k                                                 ;
  9.         for(i = 0 ; i < 4 ; i ++) for(j = 0 ; j < 5 ; j ++) e[i][j] = d[i][j]       ;
  10.         for(i = 0 ; i < 4 ; i ++) {
  11.                 for(c = 1 , j = 1 ; j < 5 ; j ++) {
  12.                         if(d[i][j] == d[i][j - 1]) {
  13.                                 c ++                                                ;
  14.                         } else {
  15.                                 if(c > 2) for(k = j - c ; k < j ; k ++) e[i][k] = 0 ;
  16.                                 c = 1                                               ;
  17.                         }
  18.                 }
  19.                 if(c > 2) for(k = j - c ; k < j ; k ++) e[i][k] = 0                 ;
  20.         }
  21.         for(j = 0 ; j < 5 ; j ++) {
  22.                 for(c = 1 , i = 1 ; i < 4 ; i ++) {
  23.                         if(d[i][j] == d[i - 1][j]) {
  24.                                 c ++                                                ;
  25.                         } else {
  26.                                 if(c > 2) for(k = i - c ; k < i ; k ++) e[k][j] = 0 ;
  27.                                 c = 1                                               ;
  28.                         }
  29.                 }
  30.                 if(c > 2) for(k = i - c ; k < i ; k ++) e[k][j] = 0                 ;
  31.         }
  32.         for(i = 0 ; i < 4 ; i ++) {
  33.                 for(j = 0 ; j < 5 ; j ++) printf("\t%d" , d[i][j])                  ;
  34.                 printf("\n")                                                        ;
  35.         }
  36.         printf("\n")                                                                ;
  37.         for(i = 0 ; i < 4 ; i ++) {
  38.                 for(j = 0 ; j < 5 ; j ++) printf("\t%d" , e[i][j])                  ;
  39.                 printf("\n")                                                        ;
  40.         }
  41. }
复制代码

      编译和运行实况:
  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3.         2       2       3       1       2
  4.         3       1       1       1       1
  5.         2       3       2       1       3
  6.         2       2       3       3       3

  7.         2       2       3       0       2
  8.         3       0       0       0       0
  9.         2       3       2       0       3
  10.         2       2       0       0       0

  11. C:\Bin>
复制代码

最佳答案

查看完整内容

现在再看呢? 编译和运行实况:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-8 23:17:13 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-11-10 00:32 编辑
zmLau0727 发表于 2019-11-10 00:02
这个还是有点问题啊,按照题目要求这个第9行的1和第11行的1也得被替换成0


        现在再看呢?

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.         int d[4][5] = {{2 , 2 , 3 , 1 , 2} ,\
  5.                        {3 , 1 , 1 , 1 , 1} ,\
  6.                        {2 , 3 , 2 , 1 , 3} ,\
  7.                        {2 , 2 , 3 , 3 , 3}}                                         ;
  8.         int c , e[4][5] , i , j , k                                                 ;
  9.         for(i = 0 ; i < 4 ; i ++) for(j = 0 ; j < 5 ; j ++) e[i][j] = d[i][j]       ;
  10.         for(i = 0 ; i < 4 ; i ++) {
  11.                 for(c = 1 , j = 1 ; j < 5 ; j ++) {
  12.                         if(d[i][j] == d[i][j - 1]) {
  13.                                 c ++                                                ;
  14.                         } else {
  15.                                 if(c > 2) for(k = j - c ; k < j ; k ++) e[i][k] = 0 ;
  16.                                 c = 1                                               ;
  17.                         }
  18.                 }
  19.                 if(c > 2) for(k = j - c ; k < j ; k ++) e[i][k] = 0                 ;
  20.         }
  21.         for(j = 0 ; j < 5 ; j ++) {
  22.                 for(c = 1 , i = 1 ; i < 4 ; i ++) {
  23.                         if(d[i][j] == d[i - 1][j]) {
  24.                                 c ++                                                ;
  25.                         } else {
  26.                                 if(c > 2) for(k = i - c ; k < i ; k ++) e[k][j] = 0 ;
  27.                                 c = 1                                               ;
  28.                         }
  29.                 }
  30.                 if(c > 2) for(k = i - c ; k < i ; k ++) e[k][j] = 0                 ;
  31.         }
  32.         for(i = 0 ; i < 4 ; i ++) {
  33.                 for(j = 0 ; j < 5 ; j ++) printf("\t%d" , d[i][j])                  ;
  34.                 printf("\n")                                                        ;
  35.         }
  36.         printf("\n")                                                                ;
  37.         for(i = 0 ; i < 4 ; i ++) {
  38.                 for(j = 0 ; j < 5 ; j ++) printf("\t%d" , e[i][j])                  ;
  39.                 printf("\n")                                                        ;
  40.         }
  41. }
复制代码

      编译和运行实况:
  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3.         2       2       3       1       2
  4.         3       1       1       1       1
  5.         2       3       2       1       3
  6.         2       2       3       3       3

  7.         2       2       3       0       2
  8.         3       0       0       0       0
  9.         2       3       2       0       3
  10.         2       2       0       0       0

  11. C:\Bin>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-9 00:32:57 | 显示全部楼层
誊写到另外一个二维数组里,誊写的时候判断是否有相邻就行
  1. #include <iostream>
  2. #include <vector>

  3. using namespace std;

  4. vector<vector<int>> SetConnectedNumZero(const vector<vector<int>>& v) {
  5.         if (v.empty() || v[0].empty()) return {};
  6.         int cy = v.size();
  7.         int cx = v[0].size();
  8.         vector<vector<int>> ret(cy, vector<int>(cx));
  9.         for (int y = 0; y < cy; ++y) {
  10.                 for (int x = 0; x < cx; ++x) {
  11.                         int n = v[y][x];
  12.                         if (
  13.                                 x > 0 && n == v[y][x - 1] ||
  14.                                 x < cx - 1 && n == v[y][x + 1] ||
  15.                                 y > 0 && n == v[y - 1][x] ||
  16.                                 y < cy - 1 && n == v[y + 1][x])
  17.                         {
  18.                                 ret[y][x] = 0;
  19.                         }
  20.                         else {
  21.                                 ret[y][x] = v[y][x];
  22.                         }
  23.                 }
  24.         }
  25.         return ret;
  26. }
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-9 09:40:29 | 显示全部楼层
Croper 发表于 2019-11-9 00:32
誊写到另外一个二维数组里,誊写的时候判断是否有相邻就行

你这用的什么语言写的呀,我有点看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-9 11:23:05 | 显示全部楼层
zmLau0727 发表于 2019-11-9 09:40
你这用的什么语言写的呀,我有点看不懂

用的C++
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-9 14:25:38 | 显示全部楼层
本帖最后由 jackz007 于 2019-11-9 16:11 编辑
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.         int d[4][5] = {{2 , 2 , 3 , 1 , 2} ,\
  5.                        {3 , 1 , 1 , 1 , 1} ,\
  6.                        {2 , 3 , 2 , 1 , 3} ,\
  7.                        {2 , 2 , 3 , 3 , 3}}                                         ;
  8.         int c , e[4][5] , i , j , k                                                 ;
  9.         for(i = 0 ; i < 4 ; i ++) for(j = 0 ; j < 5 ; j ++) e[i][j] = d[i][j]       ;
  10.         for(i = 0 ; i < 4 ; i ++) {
  11.                 for(c = 1 , j = 1 ; j < 5 ; j ++) {
  12.                         if(e[i][j] == e[i][j - 1]) {
  13.                                 c ++                                                ;
  14.                         } else {
  15.                                 if(c > 2) for(k = j - c ; k < j ; k ++) e[i][k] = 0 ;
  16.                                 c = 1                                               ;
  17.                         }
  18.                 }
  19.                 if(c > 2) for(k = j - c ; k < j ; k ++) e[i][k] = 0                 ;
  20.         }
  21.         for(i = 0 ; i < 4 ; i ++) {
  22.                 for(j = 0 ; j < 5 ; j ++) printf("\t%d" , d[i][j])                  ;
  23.                 printf("\n")                                                        ;
  24.         }
  25.         printf("\n")                                                                ;
  26.         for(i = 0 ; i < 4 ; i ++) {
  27.                 for(j = 0 ; j < 5 ; j ++) printf("\t%d" , e[i][j])                  ;
  28.                 printf("\n")                                                        ;
  29.         }
  30. }
复制代码

        编译、运行实况:
  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3.         2       2       3       1       2
  4.         3       1       1       1       1
  5.         2       3       2       1       3
  6.         2       2       3       3       3

  7.         2       2       3       1       2
  8.         3       0       0       0       0
  9.         2       3       2       1       3
  10.         2       2       0       0       0

  11. C:\Bin>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-10 00:02:28 | 显示全部楼层
jackz007 发表于 2019-11-9 14:25
编译、运行实况:

这个还是有点问题啊,按照题目要求这个第9行的1和第11行的1也得被替换成0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-10 12:32:23 | 显示全部楼层

谢谢,我才发现我把题给理解错了,你写的这个符合要求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-10 13:15:19 | 显示全部楼层
jackz007 发表于 2019-11-9 14:25
编译、运行实况:

能麻烦你注释一下代码吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-10 13:58:47 | 显示全部楼层
zmLau0727 发表于 2019-11-10 13:15
能麻烦你注释一下代码吗

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.         int d[4][5] = {{2 , 2 , 3 , 1 , 2} ,\
  5.                        {3 , 1 , 1 , 1 , 1} ,\
  6.                        {2 , 3 , 2 , 1 , 3} ,\
  7.                        {2 , 2 , 3 , 3 , 3}}                                         ;
  8.         int c , e[4][5] , i , j , k                                                 ;

  9. /* 把 d 复制到 e 中,因为 e 要动态修改,所以,d 作为参考非常必要 */
  10.         for(i = 0 ; i < 4 ; i ++) for(j = 0 ; j < 5 ; j ++) e[i][j] = d[i][j]       ;
  11. /* 按行的方向扫描相邻相等的元素并计数、删除 */
  12.         for(i = 0 ; i < 4 ; i ++) {                                                    // 4 行
  13.                 for(c = 1 , j = 1 ; j < 5 ; j ++) {                                    // 5 列
  14.                         if(d[i][j] == d[i][j - 1]) {                                   // 如果同行相邻元素相等
  15.                                 c ++                                                ;  // 重复元素计数
  16.                         } else {                                                       // 否则,相邻元素不相等
  17.                                 if(c > 2) for(k = j - c ; k < j ; k ++) e[i][k] = 0 ;  // 如果有相等元素计数就悉数就置 0
  18.                                 c = 1                                               ;  // 重新初始化重复元素计数器
  19.                         }
  20.                 }
  21.                 if(c > 2) for(k = j - c ; k < j ; k ++) e[i][k] = 0                 ;  // 行结束,如果有相等元素计数就悉数就置 0
  22.         }
  23. /* 按列的方向扫描相邻相等的元素并计数、删除 */
  24.         for(j = 0 ; j < 5 ; j ++) {                                                    // 5 列
  25.                 for(c = 1 , i = 1 ; i < 4 ; i ++) {                                    // 4 行
  26.                         if(d[i][j] == d[i - 1][j]) {                                   // 如果同列相邻元素相等
  27.                                 c ++                                                ;  // 重复元素计数
  28.                         } else {                                                       // 否则,相邻元素不相等
  29.                                 if(c > 2) for(k = i - c ; k < i ; k ++) e[k][j] = 0 ;  // 如果有相等元素计数就悉数就置 0
  30.                                 c = 1                                               ;  // 重新初始化重复元素计数器
  31.                         }
  32.                 }
  33.                 if(c > 2) for(k = i - c ; k < i ; k ++) e[k][j] = 0                 ;  // 列结束,如果有相等元素计数就悉数就置 0
  34.         }
  35. /* 打印原始输出数组 d */
  36.         for(i = 0 ; i < 4 ; i ++) {
  37.                 for(j = 0 ; j < 5 ; j ++) printf("\t%d" , d[i][j])                  ;
  38.                 printf("\n")                                                        ;
  39.         }
  40.         printf("\n")                                                                ;
  41. /* 打印删除了重复元素的数组 e */
  42.         for(i = 0 ; i < 4 ; i ++) {
  43.                 for(j = 0 ; j < 5 ; j ++) printf("\t%d" , e[i][j])                  ;
  44.                 printf("\n")                                                        ;
  45.         }
  46. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-10 14:17:49 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 17:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表