A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 14900 初级黑马   /  2014-2-24 17:15  /  865 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有一个矩阵(10*10),元素值只能为0或1,现在写一个函数判断一下有没有一行都为1,且有一列都为0(除了该行的这个元素为1外);

我当时写了个算法:但效率不高,需要优化,请大虾帮忙优化一下
bool F(int [10][10]input)
{
        for(int i=0;i<10;i++)
        {
                int j;
                for(j=0;j<10;j++)
                        if(input[i][j]==0) break;
                if(j==10)
                {
                        for(int m=0;m<10;m++)
                        {
                                for(int n=0;n<10;n++)
                                        if(input[n][m]==1&&n!=i) break;
                                if(n==10)
                                        return true;
                        }
                }
        }
        return false;
}
目前,要求优化该算法,让程序只需要扫描该矩阵一遍,即可得出结果。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

1 个回复

倒序浏览
  1. bool F( int [ 10 ][ 10 ] input )
  2. {
  3.     int nRowAllOne = 0;
  4.     int nColAllZero = 0;
  5.     int nColAllZeroTemp = 0;

  6.     for( int i=0; i < 10; i++ )
  7.     {
  8.         int sumRow = 0;
  9.         int j;
  10.         for( j = 0; j < 10; j++ )
  11.         {
  12.             if( 0 < i )//从第二行开始,把元素值都加到第一行对应元素中
  13.             {
  14.                 input[ 0 ][ j ] += input[ i ][ j ];
  15.             }
  16.             sumRow += input[ i ][ j ];//把当前列每个元素加到变量
  17.             if( 9 == i )//当前为最后一行,也已经加到第一行了
  18.             {
  19.                 //加过有列为整列和为全部是1的行数且该元素是0,则认为i该列除了那几个1之外都是0
  20.                 if( nRowAllOne == input[ 0 ][ j ] && 0 == input[ i ][ j ] )
  21.                 {
  22.                     nColAllZero++;
  23.                 }
  24.                 //加过有列为整列和为全部是1的行数+1且该元素是1,则暂时认为i该列除了那几个1之外都是0
  25.                 else if( nRowAllOne + 1 == input[ 0 ][ j ] && 1 == input[ i ][ j ] )
  26.                 {
  27.                     nColAllZeroTemp++;
  28.                 }
  29.             }
  30.         }
  31.         if( 10 == sumRow )//行全部元素和为4则该行全部都是1
  32.         {
  33.             nRowAllOne++;//有行全为1
  34.             if( 9 == i )//最后一行全都是1,则暂时认为的全部为0也都是
  35.             {
  36.                 nColAllZero += nColAllZeroTemp;
  37.             }
  38.         }
  39.     }

  40.     //如果有多行都是1,则
  41.     if( 0 < nRowAllOne && 0 < nColAllZero )//至少有一行都为1,且有一列都为0(除了该行的这个元素为1外)
  42.     {
  43.         return true;
  44.     }
  45.     return false;//没有
  46. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马