• 第十一周作业


    这个作业属于哪个课程 C语言程序设计II
    这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2824
    我在该课程的目标是 理解并灵活使用递归函数。同时了解java的创建对象,创建对象的作用及其意义
    这个作业在那个具体方面帮助我实现目标 理解并灵活使用递归函数
    参考文献 Java从入门到精通,C primer plus

    任务一:选择题:

    任务二:试题.7-1 汉诺塔问题* (10 分)

    汉诺塔是一个源于印度古老传说的益智玩具。据说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘,大梵天命令僧侣把圆盘移到另一根柱子上,并且规定:在小圆盘上不能放大圆盘,每次只能移动一个圆盘。当所有圆盘都移到另一根柱子上时,世界就会毁灭。

    请编写程序,输入汉诺塔圆片的数量,输出移动汉诺塔的步骤。
    输入格式
    圆盘数 起始柱 目的柱 过度柱
    输出格式
    移动汉诺塔的步骤
    每行显示一步操作,具体格式为:
    盘片号: 起始柱 -> 目的柱
    其中盘片号从 1 开始由小到大顺序编号。
    输入样例

    3
    a c b
    

    输出样例

    1: a -> c
    2: a -> b
    1: c -> b
    3: a -> c
    1: b -> a
    2: b -> c
    1: a -> c
    

    2.执行代码:

    #include<iostream>
    void hanio (int n, char a, char b, char c);//调用Hanno塔问题解决的函数
    using namespace std;
    int main ()
    {
    	int n;
    	char a,b,c;
    	scanf("%d
    ",&n);
    	scanf("%c %c %c",&a,&b,&c);
    	hanio (n,a,b,c);	
    	return 0;
    }
    void hanio (int n, char a, char b, char c)
    {
    	if (n==1)
    		printf ("%d: %c -> %c
    ",n,a,b);
    	else
    	{
    		hanio (n-1,a,c,b);
    		printf ("%d: %c -> %c
    ",n,a,b);
    		hanio (n-1,c,b,a);
    	}
    }
    

    3.流程图
    4.运行正确截图:

    5.总结:本题的难度不是很大,对照书本上的思路,码上即可,只需注意个数的输入,需要的过渡柱,起始柱,终止柱即可!汉诺塔问题的递归函数在执行代码:

    hanio (n-1,a,c,b);
    		printf ("%d: %c -> %c
    ",n,a,b);
    		hanio (n-1,c,b,a);
    

    中会将调换过程执行,只需注意将调换步骤输出!
    任务三:试题二. 估值一亿的AI核心代码 (20 分)
    本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:
    无论用户说什么,首先把对方说的话在一行中原样打印出来;
    消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
    把原文中所有大写英文字母变成小写,除了 I;
    把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词;
    把原文中所有独立的 I 和 me 换成 you;
    把原文中所有的问号 ? 换成惊叹号 !;
    在一行中输出替换后的句子作为 AI 的回答。
    输入样例:

    6
    Hello ?
     Good to chat   with you
    can   you speak Chinese?
    Really?
    Could you show me 5
    What Is this prime? I,don 't know
    

    输出样例:

    Hello ?
    AI: hello!
     Good to chat   with you
    AI: good to chat with you
    can   you speak Chinese?
    AI: I can speak chinese!
    Really?
    AI: really!
    Could you show me 5
    AI: I could show you 5
    What Is this prime? I,don 't know
    AI: what Is this prime! you,don't know
    

    2.分析:本题难度过大,我对此没有什么解决措施,所以我只能附上其链接

    http://www.pianshen.com/article/5255311811/
    

    3.本题询问了一下向淇同学,该题的基本算法使用了维克托数组法,此处附上其伪码,后续我在学习算法的时侯再去深究该算法:

    void solve(char * s,char * bj)
    {
    	cout<<"AI:";
        char strxxx[MAXN][MAXN]={''};
       int x = 0,a=0,b=0;
      strlwr(s);
      int m =strlen(s);
      vector<char> str;
      for(int i = 0 ; i < m ; i++)
      {
        str.push_back(s[i]);	
      }
      
      for(int i = 0 ; i < m ; i++)
      {
      	if((s[i]==' '&&s[i+1]==' ')||(s[i]==' '&&bj[i+1]==1)||(s[i]==' '&&s[i+1]=='!')||(s[i]==' '&&s[i+1]=='?')||(s[i]==' '&&s[i+1]=='.')){
    	  str.erase(str.begin()+(i-x));
    	  x++;} 
    	if(s[i]=='?')
    	{
    		str.erase(str.begin()+(i-x));
    	    str.push_back('!');
    	}
      }
     // for(int i = 0 ; i < m-x ; i++)
      //cout<<str[i];
      //cout<<endl;
      for(int i = 0 ; i < m-x ; i++){
      if(str[i]==' '){a++;b=0;}
      else strxxx[a][b++]=str[i];
      }
      
      //for(int i = 0 ; i < m-x ; i++)
      //cout<<strxxx[i];
    
      	if(strcmp(strxxx[0],"could")==0&&strcmp(strxxx[1],"you")==0)
    	{
        cout<<"I could";
        for(int i = 2 ; i < m-x ; i++)
        {
        	if(strcmp(strxxx[i],"me")==0||strcmp(strxxx[i],"I")==0)cout<<" you";
            else cout<<" "<<strxxx[i];
        }
        }
        
        else if(strcmp(strxxx[0],"can")==0&&strcmp(strxxx[1],"you")==0)
        {
        cout<<"I can";
        for(int i = 2 ; i < m-x ; i++)
        {
        	if(strcmp(strxxx[i],"me")==0||strcmp(strxxx[i],"I")==0)cout<<" you"; 	
            else cout<<" "<<strxxx[i];
        
        }
    	}
    	else
    	{
    		for(int i = 0 ; i < m-x ; i++)
    		{
    			if(strcmp(strxxx[i],"me")==0||strcmp(strxxx[i],"I")==0||strcmp(strxxx[i],"I")==0)cout<<" you"; 	
    			else cout<<" "<<strxxx[i];
    		}
    
    	}
        cout<<endl;
        
    }
    
    

    任务四:试题三.***八皇后问题 (20 分)

    在国际象棋中,皇后是最厉害的棋子,可以横走、直走,还可以斜走。棋手马克斯·贝瑟尔 1848 年提出著名的八皇后问题:即在 8 × 8 的棋盘上摆放八个皇后,使其不能互相攻击 —— 即任意两个皇后都不能处于同一行、同一列或同一条斜线上。
    现在我们把棋盘扩展到 n × n 的棋盘上摆放 n 个皇后,请问该怎么摆?请编写程序,输入正整数 n,输出全部摆法(棋盘格子空白处显示句点“.”,皇后处显示字母“Q”,每两格之间空一格)。
    输入格式

    正整数 n (0 < n ≤ 12)
    

    输出格式

    若问题有解,则输出全部摆法(两种摆法之间空一行),否则输出 None。
    

    要求:试探的顺序逐行从左往右的顺序进行,请参看输出样例2。
    输入样例1

    3
    

    输出样例1

    None
    

    输入样例2

    6
    

    输出样例2

    . Q . . . .
    . . . Q . .
    . . . . . Q
    Q . . . . .
    . . Q . . .
    . . . . Q .
    
    . . Q . . .
    . . . . . Q
    . Q . . . .
    . . . . Q .
    Q . . . . .
    . . . Q . .
    
    . . . Q . .
    Q . . . . .
    . . . . Q .
    . Q . . . .
    . . . . . Q
    . . Q . . .
    
    . . . . Q .
    . . Q . . .
    Q . . . . .
    . . . . . Q
    . . . Q . .
    . Q . . . .
    

    2.本题从网上资料检索到:使用剪枝法的解题效率还是挺高的,避免了多数无用的搜索,所以代码附在这里了!

     #include<stdio.h>
    int X[100],n,cnt=0;
    void shuchu()
    {
    	int i,j;
    	printf("
    ",++cnt);
    	for(i=1;i<=n;i++)
    	{
    	   for(j=1;j<X[i];j++) printf(".");
    	   printf("Q");
    	   for(j=X[i]+1;j<=n;j++) printf(".");
    	   printf("
    ");
    	}
    }
    int jianzhi(int k,int i)
    {
    	int j;
    	for(j=1;j<k;j++)
    	   if(X[j]==i || X[j]-i==j-k || X[j]-i==k-j)     //第一个条件判断是否有同列的 
    	             return 0;
    	             //第二个条件判断是否有对角的 
    	return 1;
    }
    void f(int k)
    {   int i;
    	if(k-1==n) shuchu();
    	else for(i=1;i<=n;i++)
    	      if(jianzhi(k,i))
    	{
    		X[k]=i;
    		f(k+1);
    	}
    }
    int main()
    {
    	scanf("%d",&n);
    	f(1);
    	return 0;
    }
    

    2.运行结果截图:

    任务五:
    编程总结:本周我学习并了解了一下递归函数的用法,我认为其难度还是不小,我觉得有时为了提高自己做题的编程速度,我还是习惯使用主函数,并配合一点算法,提高自己做题效率,这也并不是一件坏事。所以,多加练习,才是提高的根本!
    结对编程总结.这次有三道编程题,其中有两道难度太大,所以我的搭档没做,我也只搞懂了其中的50%,可能还是能力的欠缺,话不多说,只能继续学习,继续努力吧。不过说实话,我觉得挑战题的难度还是比基础编程题的难度小,所以还得多多研究多多探索!
    任务六:
    学习总结(图表).

    学习总结(统计图).

  • 相关阅读:
    SVN使用之分支、合并
    eq相等 ,ne、neq不相等 EL表达式
    PLSQL:plsql中文乱码,显示问号
    mysql中实现行号,oracle中的rowid
    安装完QQ必须要删除掉的几个恐怖文件
    关于table的一些兼容性问题
    Javascript事件绑定的几种方式
    jQuery中的一些正则匹配表达式
    将java类的泛型集合转换成json对象
    python登录豆瓣,发帖
  • 原文地址:https://www.cnblogs.com/wonzenkei/p/10834490.html
Copyright © 2020-2023  润新知