RyanChak 发表于 2022-11-14 21:09:33

判断二维数组中的重复元素

aaaaa
bb bcc
bd df   e
bggfe

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

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

字母表的循环我是直接首先定义char c=‘a';之后对c++;实现的,二维数组的遍历肯定是两个for循环,但是for循环和字母遍历的关系搞得我很迷糊

RyanChak 发表于 2022-11-14 21:47:02

bool shape(char baloon,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==baloon)&&(baloon==c)){
      horizontal++;
      }
      else if((baloon==baloon)&&(baloon==c)){
      vertical++;
      }
    }
}
if(horizontal*vertical!=0){
    return false;
}
else{
    return true;
}
}

我是这样写的,但是没有想好怎么让字母表循环起来{:10_266:}{:10_266:}

jackz007 发表于 2022-11-14 22:27:21

RyanChak 发表于 2022-11-14 21:47
我是这样写的,但是没有想好怎么让字母表循环起来

       所有的相同的字母都要在同一行或者同一列上,不太清楚是什么情况,请你举出一个同样是 4 x 5 的二维字符数组可以判断为 ture 的例子到底要怎样才能满足要求。

RyanChak 发表于 2022-11-14 22:58:20

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

最开始举的例子中b就拐弯了,所以不符合要求

RyanChak 发表于 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 fffe
c g g ge
比如这个,从a到e所有重复的字母都是组成一条直线,无论是横着还是竖着, 所以是true

最开始举的例子中b就拐弯了,所以不符合要求

jhq999 发表于 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=
    {
      'a', 'a', 'a',   'a',   'a',
      'b ', 'b', 'b', 'c','c',
      'b', 'd','d', 'f', 'e',
      'b ', 'g ','g', 'f', 'e'
    };
    char (*p)=(char(*))ch;
    struct havechar hch= {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==hch.e)
                {
                  if((1==hch.isxy&&i+1!=hch.x)||(2==hch.isxy&&j+1!=hch.y))//前俩相同元素确定是同行isxy=1,同列isxy=2,
                  {
                        hch.isxy=-1;//不在同一行或同一列isxy=-1
                  }
                  else if(0==hch.isxy)//isxy=0时是已经有这个元素了,第二次遇到这个元素
                  {
                        if(i+1==hch.x)hch.isxy=1;//如果同一行
                        else if(j+1==hch.y)hch.isxy=2;//同一列
                        else hch.isxy=-1;//不同行也不同列
                  }
                  break;
                }
            }
            if(k==n)hch.e=p,hch.isxy=0,hch.x=i+1,hch.y=j+1,n+=1;//没有这个元素,添加
      }
    }
    for(int i=0;i<n;i+=1)if(hch.isxy>=0)printf("%c ",hch.e);
    return 0;

}
a c d f e g
Process returned 0 (0x0)   execution time : 0.290 s
Press any key to continue.

jackz007 发表于 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 , i , j , k , r                                                          ;
      char (* p) = (char(*)) s                                                          ;
      for(i = 0 ; i < 128 ; i ++) d = 0                                                    ;
      for(i = 0 ; i < m * n ; i ++) d] ++                                                ;
      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 == p && r ; c ++ , j ++) ;
                        if(c > 1 && c != d]) {
                              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 == p && r ; c ++ , j ++) ;
                        if(c > 1 && c != d]) {
                              r = 0                                                         ;
                              break                                                         ;
                        }
                }
      }
      return r                                                                              ;
}

int main(void)
{
      char s                                                                     ;
      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)                                  ;
                        } while(s == ' ' || s == '\t' || s == '\n')    ;
                }
      }
      if(check(s , n , m)) printf("true\n")                                       ;
      else printf("false\n")                                                         ;
}
      编译运行实况:
D:\\C>g++ -o x x.c

D:\\C>x

a a a b b
c d d d e
c fffe
c g g ge
true

D:\\C>x
aaaaa
bb bcc
bd df   e
bggfe
false

D:\\C>

RyanChak 发表于 2022-11-15 03:58:56

感谢大佬们的解答
页: [1]
查看完整版本: 判断二维数组中的重复元素