鱼C论坛

 找回密码
 立即注册
查看: 1576|回复: 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


        现在再看呢?
#include <stdio.h>
int main(void)
{
        int d[4][5] = {{2 , 2 , 3 , 1 , 2} ,\
                       {3 , 1 , 1 , 1 , 1} ,\
                       {2 , 3 , 2 , 1 , 3} ,\
                       {2 , 2 , 3 , 3 , 3}}                                         ;
        int c , e[4][5] , i , j , k                                                 ;
        for(i = 0 ; i < 4 ; i ++) for(j = 0 ; j < 5 ; j ++) e[i][j] = d[i][j]       ;
        for(i = 0 ; i < 4 ; i ++) {
                for(c = 1 , j = 1 ; j < 5 ; j ++) {
                        if(d[i][j] == d[i][j - 1]) {
                                c ++                                                ;
                        } else {
                                if(c > 2) for(k = j - c ; k < j ; k ++) e[i][k] = 0 ;
                                c = 1                                               ;
                        }
                }
                if(c > 2) for(k = j - c ; k < j ; k ++) e[i][k] = 0                 ;
        }
        for(j = 0 ; j < 5 ; j ++) {
                for(c = 1 , i = 1 ; i < 4 ; i ++) {
                        if(d[i][j] == d[i - 1][j]) {
                                c ++                                                ;
                        } else {
                                if(c > 2) for(k = i - c ; k < i ; k ++) e[k][j] = 0 ;
                                c = 1                                               ;
                        }
                }
                if(c > 2) for(k = i - c ; k < i ; k ++) e[k][j] = 0                 ;
        }
        for(i = 0 ; i < 4 ; i ++) { 
                for(j = 0 ; j < 5 ; j ++) printf("\t%d" , d[i][j])                  ;
                printf("\n")                                                        ;
        }
        printf("\n")                                                                ;
        for(i = 0 ; i < 4 ; i ++) { 
                for(j = 0 ; j < 5 ; j ++) printf("\t%d" , e[i][j])                  ;
                printf("\n")                                                        ;
        }
}
      编译和运行实况:
C:\Bin>g++ -o x x.c

C:\Bin>x
        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

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


        现在再看呢?
#include <stdio.h>
int main(void)
{
        int d[4][5] = {{2 , 2 , 3 , 1 , 2} ,\
                       {3 , 1 , 1 , 1 , 1} ,\
                       {2 , 3 , 2 , 1 , 3} ,\
                       {2 , 2 , 3 , 3 , 3}}                                         ;
        int c , e[4][5] , i , j , k                                                 ;
        for(i = 0 ; i < 4 ; i ++) for(j = 0 ; j < 5 ; j ++) e[i][j] = d[i][j]       ;
        for(i = 0 ; i < 4 ; i ++) {
                for(c = 1 , j = 1 ; j < 5 ; j ++) {
                        if(d[i][j] == d[i][j - 1]) {
                                c ++                                                ;
                        } else {
                                if(c > 2) for(k = j - c ; k < j ; k ++) e[i][k] = 0 ;
                                c = 1                                               ;
                        }
                }
                if(c > 2) for(k = j - c ; k < j ; k ++) e[i][k] = 0                 ;
        }
        for(j = 0 ; j < 5 ; j ++) {
                for(c = 1 , i = 1 ; i < 4 ; i ++) {
                        if(d[i][j] == d[i - 1][j]) {
                                c ++                                                ;
                        } else {
                                if(c > 2) for(k = i - c ; k < i ; k ++) e[k][j] = 0 ;
                                c = 1                                               ;
                        }
                }
                if(c > 2) for(k = i - c ; k < i ; k ++) e[k][j] = 0                 ;
        }
        for(i = 0 ; i < 4 ; i ++) { 
                for(j = 0 ; j < 5 ; j ++) printf("\t%d" , d[i][j])                  ;
                printf("\n")                                                        ;
        }
        printf("\n")                                                                ;
        for(i = 0 ; i < 4 ; i ++) { 
                for(j = 0 ; j < 5 ; j ++) printf("\t%d" , e[i][j])                  ;
                printf("\n")                                                        ;
        }
}
      编译和运行实况:
C:\Bin>g++ -o x x.c

C:\Bin>x
        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

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

使用道具 举报

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

using namespace std;

vector<vector<int>> SetConnectedNumZero(const vector<vector<int>>& v) {
        if (v.empty() || v[0].empty()) return {};
        int cy = v.size();
        int cx = v[0].size();
        vector<vector<int>> ret(cy, vector<int>(cx));
        for (int y = 0; y < cy; ++y) {
                for (int x = 0; x < cx; ++x) {
                        int n = v[y][x];
                        if (
                                x > 0 && n == v[y][x - 1] ||
                                x < cx - 1 && n == v[y][x + 1] ||
                                y > 0 && n == v[y - 1][x] ||
                                y < cy - 1 && n == v[y + 1][x])
                        {
                                ret[y][x] = 0;
                        }
                        else {
                                ret[y][x] = v[y][x];
                        }
                }
        }
        return ret;
}

想知道小甲鱼最近在做啥?请访问 -> 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 编辑
#include <stdio.h>
int main(void)
{
        int d[4][5] = {{2 , 2 , 3 , 1 , 2} ,\
                       {3 , 1 , 1 , 1 , 1} ,\
                       {2 , 3 , 2 , 1 , 3} ,\
                       {2 , 2 , 3 , 3 , 3}}                                         ;
        int c , e[4][5] , i , j , k                                                 ;
        for(i = 0 ; i < 4 ; i ++) for(j = 0 ; j < 5 ; j ++) e[i][j] = d[i][j]       ;
        for(i = 0 ; i < 4 ; i ++) {
                for(c = 1 , j = 1 ; j < 5 ; j ++) {
                        if(e[i][j] == e[i][j - 1]) {
                                c ++                                                ;
                        } else {
                                if(c > 2) for(k = j - c ; k < j ; k ++) e[i][k] = 0 ;
                                c = 1                                               ;
                        }
                }
                if(c > 2) for(k = j - c ; k < j ; k ++) e[i][k] = 0                 ;
        }
        for(i = 0 ; i < 4 ; i ++) { 
                for(j = 0 ; j < 5 ; j ++) printf("\t%d" , d[i][j])                  ;
                printf("\n")                                                        ;
        }
        printf("\n")                                                                ;
        for(i = 0 ; i < 4 ; i ++) { 
                for(j = 0 ; j < 5 ; j ++) printf("\t%d" , e[i][j])                  ;
                printf("\n")                                                        ;
        }
}
        编译、运行实况:
C:\Bin>g++ -o x x.c

C:\Bin>x
        2       2       3       1       2
        3       1       1       1       1
        2       3       2       1       3
        2       2       3       3       3

        2       2       3       1       2
        3       0       0       0       0
        2       3       2       1       3
        2       2       0       0       0

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
能麻烦你注释一下代码吗

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

/* 把 d 复制到 e 中,因为 e 要动态修改,所以,d 作为参考非常必要 */
        for(i = 0 ; i < 4 ; i ++) for(j = 0 ; j < 5 ; j ++) e[i][j] = d[i][j]       ;
/* 按行的方向扫描相邻相等的元素并计数、删除 */
        for(i = 0 ; i < 4 ; i ++) {                                                    // 4 行 
                for(c = 1 , j = 1 ; j < 5 ; j ++) {                                    // 5 列
                        if(d[i][j] == d[i][j - 1]) {                                   // 如果同行相邻元素相等
                                c ++                                                ;  // 重复元素计数
                        } else {                                                       // 否则,相邻元素不相等
                                if(c > 2) for(k = j - c ; k < j ; k ++) e[i][k] = 0 ;  // 如果有相等元素计数就悉数就置 0
                                c = 1                                               ;  // 重新初始化重复元素计数器
                        }
                }
                if(c > 2) for(k = j - c ; k < j ; k ++) e[i][k] = 0                 ;  // 行结束,如果有相等元素计数就悉数就置 0
        }
/* 按列的方向扫描相邻相等的元素并计数、删除 */
        for(j = 0 ; j < 5 ; j ++) {                                                    // 5 列
                for(c = 1 , i = 1 ; i < 4 ; i ++) {                                    // 4 行
                        if(d[i][j] == d[i - 1][j]) {                                   // 如果同列相邻元素相等
                                c ++                                                ;  // 重复元素计数
                        } else {                                                       // 否则,相邻元素不相等
                                if(c > 2) for(k = i - c ; k < i ; k ++) e[k][j] = 0 ;  // 如果有相等元素计数就悉数就置 0
                                c = 1                                               ;  // 重新初始化重复元素计数器
                        }
                }
                if(c > 2) for(k = i - c ; k < i ; k ++) e[k][j] = 0                 ;  // 列结束,如果有相等元素计数就悉数就置 0
        }
/* 打印原始输出数组 d */
        for(i = 0 ; i < 4 ; i ++) { 
                for(j = 0 ; j < 5 ; j ++) printf("\t%d" , d[i][j])                  ;
                printf("\n")                                                        ;
        }
        printf("\n")                                                                ;
/* 打印删除了重复元素的数组 e */
        for(i = 0 ; i < 4 ; i ++) { 
                for(j = 0 ; j < 5 ; j ++) printf("\t%d" , e[i][j])                  ;
                printf("\n")                                                        ;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 12:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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