鱼C论坛

 找回密码
 立即注册
查看: 2133|回复: 7

[已解决]判断二维数组中的重复元素

[复制链接]
发表于 2022-11-14 21:09:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
a  a  a  a  a
b  b b  c  c
b  d d  f   e
b  g  g  f  e

以上述数组为例,除了b以为,其他的重复字母都是排列在相同的行或者相同的列上的。我想要写出一个函数,其目的是判断相同的字母是不是都排列在同一行或列   

首先循环字母表,判断是哪个字母,然后判断重复的字母是否在同一行或者列上,如果全部存在的字母都是符合要求的,则返回true,否则返回false。

字母表的循环我是直接首先定义char c=‘a';之后对c++;实现的,二维数组的遍历肯定是两个for循环,但是for循环和字母遍历的关系搞得我很迷糊
最佳答案
2022-11-15 00:22:38
本帖最后由 jackz007 于 2022-11-15 00:25 编辑
#include <stdio.h>

int check(char s[] , int n , int m)
{
        int c , d[128] , i , j , k , r                                                          ;
        char (* p)[m] = (char(*)[m]) s                                                          ;
        for(i = 0 ; i < 128 ; i ++) d[i] = 0                                                    ;
        for(i = 0 ; i < m * n ; i ++) d[s[i]] ++                                                ;
        for(i = 0 , r = 1 ; i < n && r ; i ++) {
                for(k = 0 ; k < m && r ; k = j) {
                        for(c = 1 , j = k + 1 ; j < m && p[i][j] == p[i][k] && r ; c ++ , j ++) ;
                        if(c > 1 && c != d[p[i][k]]) {
                                r = 0                                                           ;
                                break                                                           ;
                        }
                }
        }
        for(i = 0 ; i < m && r ; i ++) {
                for(k = 0 ; k < n && r ; k = j) {
                        for(c = 1 , j = k + 1 ; j < n && p[j][i] == p[k][i] && r ; c ++ , j ++) ;
                        if(c > 1 && c != d[p[k][i]]) {
                                r = 0                                                           ;
                                break                                                           ;
                        }
                }
        }
        return r                                                                                ;
}

int main(void)
{
        char s[4][5]                                                                     ;
        int i , j , k , m , n                                                            ;
        for(n = 4 , i = 0 ; i < n ; i ++) {
                for(m = 5 , j = 0 ; j < m ; j ++) {
                        do {
                                scanf("%c" , & s[i][j])                                  ;
                        } while(s[i][j] == ' ' || s[i][j] == '\t' || s[i][j] == '\n')    ;
                }
        }
        if(check(s[0] , n , m)) printf("true\n")                                         ;
        else printf("false\n")                                                           ;
}
        编译运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x

a a a b b
c d d d e
c f  f  f  e
c g g g  e
true

D:\[00.Exerciese.2022]\C>x
a  a  a  a  a
b  b b  c  c
b  d d  f   e
b  g  g  f  e
false

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-14 21:47:02 | 显示全部楼层
bool shape(char baloon[MAX][MAX],int row,int col){
  int i,j;
  int horizontal=0,vertical=0;
  char c='A';

  for(i=1;i<row-1;i++){
    for(j=1;j<col-1;j++){
      if((baloon[i][j]==baloon[i][j+1])&&(baloon[i][j]==c)){
        horizontal++;
      }
      else if((baloon[i][j]==baloon[i+1][j])&&(baloon[i][j]==c)){
        vertical++;
      }
    }
  }
  if(horizontal*vertical!=0){
    return false;
  }
  else{
    return true;
  }
}

我是这样写的,但是没有想好怎么让字母表循环起来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-14 22:27:21 | 显示全部楼层
RyanChak 发表于 2022-11-14 21:47
我是这样写的,但是没有想好怎么让字母表循环起来

       所有的相同的字母都要在同一行或者同一列上,不太清楚是什么情况,请你举出一个同样是 4 x 5 的二维字符数组可以判断为 ture 的例子到底要怎样才能满足要求。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-14 22:58:20 | 显示全部楼层
a a a b b
c d d d e
c f  f  f  e
c g g g  e
比如这个,从a到e所有重复的字母都是组成一条直线,无论是横着还是竖着, 所以是true

最开始举的例子中b就拐弯了,所以不符合要求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-14 22:59:16 | 显示全部楼层
jackz007 发表于 2022-11-14 22:27
所有的相同的字母都要在同一行或者同一列上,不太清楚是什么情况,请你举出一个同样是 4 x 5 的二 ...


a a a b b
c d d d e
c f  f  f  e
c g g g  e
比如这个,从a到e所有重复的字母都是组成一条直线,无论是横着还是竖着, 所以是true

最开始举的例子中b就拐弯了,所以不符合要求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-14 23:20:23 | 显示全部楼层
本帖最后由 jhq999 于 2022-11-14 23:46 编辑
#include<stdio.h>
struct havechar
{
    char e;
    int isxy,x,y;
};
int main()
{
    char ch[20]=
    {
        'a', 'a', 'a',   'a',   'a',
        'b ', 'b', 'b', 'c',  'c',
        'b', 'd','d', 'f', 'e',
        'b ', 'g ','g', 'f', 'e'
    };
    char (*p)[5]=(char(*)[5])ch;
    struct havechar hch[20]= {0};
    int n=0;
    for(int i=0; i<4; i+=1)
    {
        for(int j=0; j<5; j+=1)
        {
            int k=0;
            for(; k<n; k+=1)
            {
                if(p[i][j]==hch[k].e)
                {
                    if((1==hch[k].isxy&&i+1!=hch[k].x)||(2==hch[k].isxy&&j+1!=hch[k].y))//前俩相同元素确定是同行isxy=1,同列isxy=2,
                    {
                        hch[k].isxy=-1;//不在同一行或同一列isxy=-1
                    }
                    else if(0==hch[k].isxy)//isxy=0时是已经有这个元素了,第二次遇到这个元素
                    {
                        if(i+1==hch[k].x)hch[k].isxy=1;//如果同一行
                        else if(j+1==hch[k].y)hch[k].isxy=2;//同一列
                        else hch[k].isxy=-1;//不同行也不同列
                    }
                    break;
                }
            }
            if(k==n)hch[n].e=p[i][j],hch[n].isxy=0,hch[n].x=i+1,hch[n].y=j+1,n+=1;//没有这个元素,添加
        }
    }
    for(int i=0;i<n;i+=1)if(hch[i].isxy>=0)printf("%c ",hch[i].e);
    return 0;

}
a c d f e g
Process returned 0 (0x0)   execution time : 0.290 s
Press any key to continue.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-15 00:22:38 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-11-15 00:25 编辑
#include <stdio.h>

int check(char s[] , int n , int m)
{
        int c , d[128] , i , j , k , r                                                          ;
        char (* p)[m] = (char(*)[m]) s                                                          ;
        for(i = 0 ; i < 128 ; i ++) d[i] = 0                                                    ;
        for(i = 0 ; i < m * n ; i ++) d[s[i]] ++                                                ;
        for(i = 0 , r = 1 ; i < n && r ; i ++) {
                for(k = 0 ; k < m && r ; k = j) {
                        for(c = 1 , j = k + 1 ; j < m && p[i][j] == p[i][k] && r ; c ++ , j ++) ;
                        if(c > 1 && c != d[p[i][k]]) {
                                r = 0                                                           ;
                                break                                                           ;
                        }
                }
        }
        for(i = 0 ; i < m && r ; i ++) {
                for(k = 0 ; k < n && r ; k = j) {
                        for(c = 1 , j = k + 1 ; j < n && p[j][i] == p[k][i] && r ; c ++ , j ++) ;
                        if(c > 1 && c != d[p[k][i]]) {
                                r = 0                                                           ;
                                break                                                           ;
                        }
                }
        }
        return r                                                                                ;
}

int main(void)
{
        char s[4][5]                                                                     ;
        int i , j , k , m , n                                                            ;
        for(n = 4 , i = 0 ; i < n ; i ++) {
                for(m = 5 , j = 0 ; j < m ; j ++) {
                        do {
                                scanf("%c" , & s[i][j])                                  ;
                        } while(s[i][j] == ' ' || s[i][j] == '\t' || s[i][j] == '\n')    ;
                }
        }
        if(check(s[0] , n , m)) printf("true\n")                                         ;
        else printf("false\n")                                                           ;
}
        编译运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x

a a a b b
c d d d e
c f  f  f  e
c g g g  e
true

D:\[00.Exerciese.2022]\C>x
a  a  a  a  a
b  b b  c  c
b  d d  f   e
b  g  g  f  e
false

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-15 03:58:56 | 显示全部楼层
感谢大佬们的解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 17:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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