首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • C语言趣味算法设计
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-05-11 19:12:35 楼主
    1、   如果矩阵A中存在这样的一个元素A[i][j]满足下列条件:A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称之为该矩阵的一个马鞍点。编写一个程序计算出矩阵A的所有马鞍点,以及其位置。


    2、一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859。两小时后里程表上又出现了一个新的对称数。编写一个程序求该车的速度以及这新的对称数。


    3、编写一个人机猜数游戏,游戏玩法如下:


    由计算机“想”一个四位数,请人猜这个四位数是多少。人输入四位数字后,计算机首先判断这四位数字中有几位是猜对了,并且在对的数字中又有几位位置也是对的,将结果显示出来,给人以提示,请人再猜,直到人猜出计算机所想的四位数是多少为止。
          例如:计算机“想”了一个“1234”请人猜,可能的提示如下:
                人猜的整数           计算机判断有几个数字正确           有几个位置正确
                      1122                                                 2                                               1
                      3344                                                 2                                               1
                      3312                                                 3                                               0
                      4123                                                 4                                               0
                      1243                                                 4                                               2
                      1234                                                 4                                               4


    游戏结束


    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-05-11 22:58:451楼 得分:0
    我也来试试,初级,还望多多指教

    #include <iostream>
    using   namespace   std;

    #define   ROW   3     //行
    #define   LIE   3     //列

    void   main()
    {
    int   A[ROW][LIE];
    int   i,j;
    cout < < "请初始化该数组: " < <endl;
    for(i=0;i <ROW;i++)
    {
    for(j=0;j <LIE;j++)
    {
    cin> > A[i][j];
    }

    }
    int   min=0,m=0,k=0,number=0;   //number用来记录马鞍点的个数
    for(i=0;i <ROW;i++)                   //得到每一行的最小元素
    {
    min=A[i][0];
    for(j=0;j <LIE;j++)
    {
    if(A[i][j] <min)   { min=A[i][j];   k=j; }
    }
    for(m=0;m <ROW;m++)       //判断该元素在其所在列中是否是该列的最大元素
    {
    if(m==i&&m!=ROW-1)   m++;
    if(A[m][k]> min)   break;
    if(m==ROW-1)
    {   cout < < "马鞍点为A[ " < <i < < "][ " < <k < < "]= " < <A[i][k] < <endl;  
    number++;   }
    }
    }
    if(number==0)   cout < < "没有马鞍点! " < <endl;
    else   cout < < "共有马鞍点 " < <number < < "个 " < <endl;

    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-06-28 15:48:422楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wjt2000
    • 等级:
    发表于:2007-07-04 15:55:583楼 得分:0
    int   d(int   big)
    {
    int   len   =   0;
    while(   big     >   10)
    {
    len++;
    big   =   big/10;
    }

    return   len+1;
    }

    int   v(int   num   ,const   int   base   =   10)
    {
    int   value   =   1;
    for(int   i   =   1;i <=   num   ;i++)
                        value   *=   base;

    return   value;
    }

    int   is_palindrome(int   num,int   len)
    {
    int   begin   =   1;
    int   end   =   len;

    while(   begin   <   end)
    {
    int   i   =   (   num   /   v(begin-1))   %10   ;
    int   j   =   (   num   /   v(end     -1))   %10   ;
                   
    if(i   !=   j)
    return   -1;
    begin++;
    end--;
    }

    return   1;
    }
         
    int   main(int   argc,   char*   argv[])
    {    
            int   i     =   95859;
            while(++i   <   100000)
    if(     is_palindrome(i,   d(i))   ==   1     )
    printf( "%7d\t ",i);
    )
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wjt2000
    • 等级:
    发表于:2007-07-04 16:04:094楼 得分:0
    sorry     int   d(int   big)
      有问题   不想改了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-07-04 16:08:065楼 得分:0
    记得猜字游戏是我第一个完成的程序,是用小霸王学习机上的basic写的:)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wjt2000
    • 等级:
    发表于:2007-07-04 16:11:406楼 得分:0
    int   d(int   big)
    {
    int   len   =   0;
    while(   big     > =   10)
    {
    len++;
    big   =   big/10;
    }

    return   len+1;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-07-07 01:40:407楼 得分:0
    的确经典,也很容易,看得就是算法了,看谁的算法好。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-07-07 20:44:328楼 得分:0
    看看高手的答案
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-07-08 15:08:149楼 得分:0
    关于第3个游戏
    可以反串角色来玩,规则不变,只是让计算机猜人想出来的数字(当然人不可以耍赖吆!)
    这个程序如果编出来,它就可以与满足原先要求的程序PK!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-21 14:56:5210楼 得分:0
    for(int i = 95859 + 1; i < 1e6; i++)
    {
    int gewei = i % 10;
    int shiwei = (i / 10) % 10;
    int qianwei = (i / 1000) % 10;
    int wanwei = i / 10000;
    if(gewei == wanwei && shiwei == qianwei)
      return i;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-21 16:31:1011楼 得分:0
    看过,没想到什么特别好的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hhuiorre
    • 等级:
    发表于:2008-07-22 13:45:5112楼 得分:0
    该回复于2008-07-22 15:41:57被管理员删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-22 15:44:3513楼 得分:0
    1、分三步,没考虑行列中存在重复元素(步骤相同,时间复杂度不同),

    a、遍历每行得到每行最小的数将其位置存于数组M中(M中保存的是一个递增数列),

    b、遍历每列得到每列最大的数将其位置存于数组N中,

    c、遍历数组N,二分查找数组M中是否存在与数组N相同的元素,

        如果相同,这就是原数组中马鞍点的位置

    (其中a,b的时间复杂度为O(n^2),c的时间复杂度为O(n*logn))

    A[i][j]在数组位置计算公式(p=i*n+j);

    2、
      n位数,自高位截取一半得到数m(若n为奇数,包括中间位)(95859  截取前面一半得958,),

      循环m+1,m+2,m+3........构造对称数。(959,960,961,962..............)

      若不考虑车速限制一直可以循环下去。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-22 17:06:5014楼 得分:0

    #include "stdafx.h"
    #include <iostream>

    using namespace std;

    bool IsSymmetry(int num )
    {
    int a[6];
    int i;
    for( i=0;i <6;i++)
    {
    a[i] = num%10;
    num = num/10;
    if( num == 0 )
    break;
    }
    for( int k=0;k < i/2;k++)
    {
    if( a[k] != a[ 5-1-k] )
    return false;
    }
    return true;
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
    int begin = 95959;
    int k;
    for(  k=1;k <600;k++)
    {
    if(IsSymmetry( begin + k ) )
    cout  < <("Speed is  ") < < k < <endl;
    }
    }


    路程 110 210 310 410 510 都可以 
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-22 21:03:5815楼 得分:0
    第二题考虑第二个对数小于100000如果可以大于这个直接100001就可以,这样汽车2000+/小时。。
    因为第一个数是9则新的对数第一个仍然为9,最后一个数也肯定为9,汽车速度*2最后一位必然为0,就不会对十位产生进位。这就可以单独只考虑585的下一个对数了,当然不能超过1000。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 00:52:1316楼 得分:0
    引用楼主 heper 的帖子:
    2、一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859。两小时后里程表上又出现了一个新的对称数。编写一个程序求该车的速度以及这新的…

    显然只有95959靠谱,50km/h,其他任意的数速度都太不靠谱了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-24 08:53:2517楼 得分:0
    引用楼主 heper 的帖子:
    3、编写一个人机猜数游戏,游戏玩法如下:

    C++程序:
    C/C++ code
    #include <iostream> #include <vector> #include <algorithm> #include <iterator> #include <ctime> const int wei=4; using namespace std; void num2array(int num,int *arr); void right_numerics(const int *dst,const int *src,int &nums,int &ords); int main(int argc, char* argv[]) { int i=0,t,a[4]={0},b[4]={0},m,n; time_t tt; ostream_iterator<int> oi(cout," "); time(&tt); srand(tt); t=1000+random(9000); num2array(t,a); do{ cout<<"Enter a number in [1000,9999],0 to end:"; cin>>t; if(t==0){ cout<<"This is "; copy(&a[0],&a[wei],oi); break; } num2array(t,b); right_numerics(b,a,m,n); cout<<"Right numerics:"<<m<<" and right ordering:"<<n<<endl; i++; if(n==wei){ cout<<"Very good! You guess "<<i<<" times."<<endl; break; } }while(true); return 0; } void num2array(int num,int *arr){ for (int i=wei-1;i>=0;i--){ arr[i]=num%10; num/=10; } } void right_numerics(const int *dst,const int *src,int &nums,int &ords){ vector <int> v(wei); vector<int>::iterator it; int i; nums=ords=0; for(i=0;i<wei;i++)v[i]=src[i]; for(i=0;i<wei;i++){ if(dst[i]==v[i]){ nums++; ords++; v[i]=-1; } else if(it=find(v.begin(),v.end(),dst[i]),it!=v.end()){ *it=-1; nums++; } } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzlu000
    • 等级:
    发表于:2008-07-24 10:27:2218楼 得分:0
    C程序:
    #include <time.h>
    #include <stdio.h>
    #include <stdlib.h>
    void main()
    {
    int com_num,cnt;
    int gress_process(int);
    int judge_repeat_num_cnt(int ,int);
    int judge_repeat_pos_cnt(int ,int);
    srand((int)time(NULL));
    com_num = 1000 + rand()%9000;
    printf("this game is guess the comper's given num.\nHave a Good time!\n");
    cnt = gress_process(com_num);
    printf("Good! the total times are:%d",cnt);
    }
    int gress_process(int comNum)
    {
    int per_num,pc_num,pos_cnt,num_cnt,cnt=0;
    pc_num = comNum;
    while (1)
    {
    printf("Please give your num in [1000,10000]!\n");
    scanf("%d",&per_num);
    pos_cnt = judge_repeat_pos_cnt(per_num,pc_num);
    num_cnt = judge_repeat_num_cnt(per_num,pc_num);
    if(pos_cnt!=4 ¦ ¦num_cnt!=4)
    {
    cnt++;
    printf("same pos cnt:%d,same num cnt:%d\n",pos_cnt,num_cnt);
    }
    else
    {
    printf("same pos cnt:%d,same num cnt :%d\n",pos_cnt,num_cnt);
    break;
    }
    }
    return cnt;
    }
    int judge_repeat_num_cnt(int person,int computer)
    {
    int firNum,secNum,ret=0;
    firNum = person;
    secNum = computer;
    if(firNum%10==secNum%10 ¦ ¦firNum%10==secNum/10%10 ¦ ¦firNum%10==secNum/100%10 ¦ ¦firNum%10==secNum/1000)ret++;
    if(firNum/10%10==secNum%10 ¦ ¦firNum/10%10==secNum/10%10 ¦ ¦firNum/10%10==secNum/100%10 ¦ ¦firNum/10%10==secNum/1000)ret++;
    if(firNum/100%10==secNum%10 ¦ ¦firNum/100%10==secNum/10%10 ¦ ¦firNum/100%10==secNum/100%10 ¦ ¦firNum/100%10==secNum/1000)ret++;
    if(firNum/1000==secNum%10 ¦ ¦firNum/1000==secNum/10%10 ¦ ¦firNum/1000==secNum/100%10 ¦ ¦firNum/1000==secNum/1000)ret++;
    return ret;
    }
    int judge_repeat_pos_cnt(int person,int computer)
    {
    int firNum,secNum,ret=0;

    for (firNum = person,secNum = computer;firNum>0;firNum = firNum/10,secNum = secNum/10)
    {
    if(firNum%10==secNum%10)ret++;
    }
    return ret;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-24 17:55:5619楼 得分:0
    引用 18 楼 zzlu000 的回复:
    if(firNum%10==secNum%10 ¦ ¦firNum%10==secNum/10%10 ¦ ¦firNum%10==secNum/100%10 ¦ ¦firNum%10==secNum/1000)ret++;
    if(firNum/10%10==secNum%10 ¦ ¦firNum/10%10==secNum/10%10 ¦ ¦firNum/10%10==secNum/100%10 ¦ ¦firNum/10%10==secNum/1000)ret++;
    if(firNum/100%10==secNum%10 ¦ ¦firNum/100%10==secNum/10%10 ¦ ¦firNum/100%10==secNum/100%10 ¦ ¦firNum/100%10==secNum/1000)ret++;
    if(firNum/1000==secNum%10 ¦ ¦firNum/1000==secNum/10%10 ¦ ¦firNum/1000==secNum/100%10 ¦ ¦firNum/1000==secNum/1000)ret++;
    return ret;

    这个程序没有考虑数有两位相同的情况,如电脑:1234,人猜3333,函数会返回4,但是应该返回1,因为实际上只猜对了1个数
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-26 12:21:1920楼 得分:0
    引用 9 楼 uwinb 的回复:
    关于第3个游戏
    可以反串角色来玩,规则不变,只是让计算机猜人想出来的数字(当然人不可以耍赖吆!)
    这个程序如果编出来,它就可以与满足原先要求的程序PK!


    哈哈,英雄所见略同啊,我曾经躺在床上想这个算法,就是要用最短的步骤猜出来,可惜基础太差了没想出来
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-26 19:34:5621楼 得分:0
    BS一遍即可,没有必要帮这种自己不想学习的人

    又是作业,我在某书上看到过,是课后习题。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved