| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1828 人关注过本帖
标题:求写个程序,真的很急,感激感激!!
只看楼主 加入收藏
yiming5954
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2008-4-3
收藏
 问题点数:0 回复次数:14 
求写个程序,真的很急,感激感激!!
一个矩阵
a[32][5]={0 0 0 0 0                     
0 0 0 0 1
0 0 0 1 0                             就是如左边的一个矩阵,让我们找出其中的四行,使其中的四行必须的满
0 0 0 1 1                          足:任意两行之间的相同的列上有不通的数的个数为大于等于3;让我们找
0 0 1 0 0                          出有多少种组合能符合这样的条件的四行,并且输出这些所找出来的四行。
0 0 1 0 1                         只有这 一个条件,希望大家帮帮忙!在此小弟感激不尽!
0 0 1 1 0                         还有什么不明白的请提出,小弟在线等待,真的谢谢了!
0 0 1 1 1                         毕设的题,真的很急
0 1 0 0 0
0 1 0 0 1
0 1 0 1 0
0 1 0 1 1
0 1 1 0 0
0 1 1 0 1
0 1 1 1 0
0 1 1 1 1
1 0 0 0 0
1 0 0 0 1
1 0 0 1 0
1 0 0 1 1
1 0 1 0 0
1 0 1 0 1
1 0 1 1 0
1 0 1 1 1
1 1 0 0 0
1 1 0 0 1
1 1 0 1 0
1 1 0 1 1
1 1 1 0 0
1 1 1 0 1
1 1 1 1 0
1 1 1 1 1}
搜索更多相关主题的帖子: 感激 矩阵 条件 
2008-04-03 15:25
yiming5954
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2008-4-3
收藏
得分:0 
小弟的QQ:122 489 488
EMAIL:yiming5954@
2008-04-03 15:27
我是老刘
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-4-3
收藏
得分:0 
for i=0,i<29,i++{ //一行行往下找
  for j=i,j<i+4,j++
    for k=j+1,k<i+4,k++ //j和k控制四行里各种组合
      for l=0,l<5,l++{ //找到重复的列,计算是否超过3列,是的话存到数组m和n中
        if a[j][l] == a[k][l]
          sum++;   
        if sum>=3
        m[a++]=j,n[b++]=k //m[0] n[0]是符合的第一组,a代表第一个行,b代表第二个行,m[1] n[1]存着第二组,以此类推...
       }
}
到时会有很多重复的,不知怎么把它提取出来,大概思路是这样子,在亲戚家还有事不能再想多些了,先等高手
2008-04-03 16:16
lisypro
Rank: 4
等 级:业余侠客
威 望:3
帖 子:695
专家分:216
注 册:2005-9-25
收藏
得分:0 
帮你顶一下

长期承接管理系统
代做各种vb/ / vc小程序
QQ:82341763
手机:13623290828
群号 11619730
2008-04-03 21:17
酷猫
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2007-9-8
收藏
得分:0 
看不懂,学习下!

生活真TM好玩,因为生活老TM玩我!
2008-04-03 22:06
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
昨天写的有错误,今天修改了一下,另外根据题意改为只输出组合(按顺序排列的一组)
而不是排列,写的仓促可能还会有问题,欢迎提出宝贵意见!
#include "stdio.h"

#define TRUE  1
#define FALSE 0

/*===================================
算法描述:

题中给出的数组是自然数顺序的整数,只是
按照五位二进制格式输出,所以不用记下
每组的数,只是用整数来判断是否满足条件,
将符合条件的结果再按二进制展开输出即可。

在判断是否不同列的个数大于三时,用了异或
操作,再求出异或结果中1的个数简化操作。
===================================*/

/*===================================
判断两个数不同的列数是否大于3
===================================*/
int TwoLineIsValid(int a,int b)
{
    int num=0;
    a = a^b;                //求两个数的异或,结果的二进制格式有几个1,就有几个不同



    //判断二进制格式中1的个数
    do
    {
        if(1 == (a % 2))
            num++;
        a /= 2;
    }while(a!=0);

    if(num>=3)
        return TRUE;
    return FALSE;
}

/*===================================
判断一组数是否满足输出条件
===================================*/
int ArrIsValid(int arr[4])
{
    int a,b;
    for(a=0;a<3;a++)
    {
        for(b=a+1;b<4;b++)
        {
            if(TRUE != TwoLineIsValid(arr[a],arr[b]))
                return FALSE;
        }
    }
    return TRUE;
}


/*===================================
打印符合条件的数组
===================================*/
void Output(int input[4],int num)
{
    int temp[5];
    int arr[4];
    int a,b;
    for(a=0;a<4;a++)
    {
        arr[a]=input[a];
    }
    printf("%d:%d,%d,%d,%d\n",num,arr[0],arr[1],arr[2],arr[3]);
    printf("**************************************\n");
    for(a=0;a<4;a++)
    {
        for(b=0;b<5;b++)
        {
            temp[b] = 0;
        }
        b=0;
        do
        {
            temp[b] = arr[a] % 2;
            arr[a] /= 2;
            b++;
        }while(arr[a] != 0);
        for(b=5;b>0;b--)
        {
            printf("%d\t",temp[b-1]);
        }
        printf("\n");
    }
    printf("**************************************\n");
    printf("press Enter to continue...");
    getchar();
}

int main()
{
    int aLine[4];    //四行为一组,保存一组的序号
    int a,b,c,d;    //循环变量数组
    int num = 0;

    //由于求的是组合不是排列,所以只求出顺序排列的一组
    for(a=0;a<32;a++)
    {
        aLine[0] = a;
        for(b=a+1;b<32;b++)
        {
            if(b == a)
            continue;
            aLine[1] = b;
            for(c=b+1;c<32;c++)
            {
                if((c == a)||(c == b))
                continue;
                aLine[2] = c;
                for(d=c+1;d<32;d++)
                {
                    if((d == a)||(d == b)||(d == c))
                    continue;
                    aLine[3]=d;
                    if(TRUE == ArrIsValid(aLine))
                    {
                        num++;
                        Output(aLine,num);
                    }
                }
            }
        }
    }
    getchar();
    return 0;
}

[[it] 本帖最后由 moonwalker 于 2008-4-4 10:12 编辑 [/it]]

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-04-04 00:27
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
不理解

—>〉Sun〈<—
2008-04-04 00:32
lingyun1101
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2008-4-4
收藏
得分:0 
有点点蒙
2008-04-04 01:39
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
我在6楼加了些注释,另外main函数中的循环为了方便理解,没有改成递归形式
层数比较多,有些乱,呵呵。

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-04-04 10:15
yiming5954
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2008-4-3
收藏
得分:0 
先谢谢大家了!!!真的很感谢,有这么多的朋友来帮忙,我真的好感动,第一次发帖就有这么多的人关心我o(∩_∩)o...哈哈
下面是我用java编的程序,刚开始用c编的,后来发现结果不能全部显示出来,vc也一样,dos环境是有些缺憾哈~~~
各位大侠看过后给提个意见,就是我编好的这个程序,如何把重复的挑出来?在哪进行修改?
import java.lang.Math;
public class Distance {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[][]z = {{0, 0, 0, 0, 0},
                {0, 0, 0, 0, 1},
                {0, 0, 0, 1, 0},
                {0, 0, 1, 0, 0},
                {0, 1, 0, 0, 0},
                {1, 0, 0, 0, 0},
                {0, 0, 0, 1, 1},
                {0, 0, 1, 1, 0},
                {0, 1, 1, 0, 0},
                {1, 1, 0, 0, 0},
                {1, 0, 1, 0, 0},
                {0, 1, 0, 1, 0},
                {0, 0, 1, 0, 1},
                {1, 0, 0, 1, 0},
                {0, 1, 0, 0, 1},
                {1, 0, 0, 0, 1},
                {1, 1, 1, 0, 0},
                {1, 1, 0, 0, 1},
                {1, 0, 0, 1, 1},
                {0, 0, 1, 1, 1},
                {0, 1, 0, 1, 1},
                {1, 0, 1, 0, 1},
                {1, 1, 0, 1, 0},
                {0, 1, 1, 0, 1},
                {1, 0, 1, 1, 0},
                {0, 1, 1, 1, 0},
                {1, 1, 1, 1, 0},
                {1, 1, 1, 0, 1},
                {1, 1, 0, 1, 1},
                {1, 0, 1, 1, 1},
                {0, 1, 1, 1, 1},
                {1, 1, 1, 1, 1}
    };
        int dis1,dis2,dis3,dis4,dis5,dis6,k,p,q,count=0;
        for(int i = 0; i<32; i++)
        {
            for(int j = 0; j<32; j++)
            {
                if(j==i)continue;
                dis1=0;k=i;
                for(int h = 0;h<5;h++)
                {
                    dis1+= Math.abs(z[k][h]-z[j][h]);
                }
                if(dis1>=3)
                {
                    
                    for(int m=0;m<32;m++)
                    {
                        dis2=0;dis3=0;
                        p=j;
                        if(m==k||m==p) continue;
                        for(int a = 0;a<5;a++)
                        {
                            dis2+=Math.abs(z[k][a]-z[m][a]);
                            
                            dis3+=Math.abs(z[p][a]-z[m][a]);
                            
                        }
                        if(dis2==3&&dis3==3)
                        {
                            
                            for(int y=0;y<32;y++)
                            {
                                dis4=0;dis5=0;dis6=0;
                                q=m;
                                if(y==k||y==p||y==q) continue;
                                for(int h=0;h<5;h++)
                                {
                                    dis4+=Math.abs(z[k][h]-z[y][h]);
                                    
                                    dis5+=Math.abs(z[p][h]-z[y][h]);
                                    
                                    dis6+=Math.abs(z[q][h]-z[y][h]);
                                    
                                    
                                }
                                if(dis4>=3&&dis5>=3&&dis6>=3)
                                {
                                    System.out.println("z["+k+"]z["+p+"]z["+q+"]z["+y+"]的任意两个距离都大于3");
                                    count++;
                                }
                                
                                    
                            }
                            
                        }
                        
                    }
                }
            }
            
        }
        System.out.println("共有"+count/4+"组");
    }

}

[[it] 本帖最后由 yiming5954 于 2008-4-7 12:43 编辑 [/it]]
2008-04-04 11:48
快速回复:求写个程序,真的很急,感激感激!!
数据加载中...
 
   



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

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