题目---汉诺塔及AI代码及八皇后
2019春第十一周作业
这个作业属于那个课程 | C语言程序设计II |
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3201 |
我在这个课程的目标是 | 熟悉经典数论 |
这个作业在那个具体方面帮助我实现目标 | 递归函数及数论 |
参考文献 | 算法入门经典,基础数论i,ii,iii |
本周题目难度算目前以来难度最高的一次了,反正的我是枯了,写了很久才写出来,咱也不敢问,咱也不知道为什么。
选择题
宏定义“#define DIV(a, b) a/b”,经DIV(x + 5, y - 5) 引用,替换展开后是()。 (1分)
- x + 5 / y - 5
- (x + 5 / y – 5)
- (x + 5) / (y - 5)
- (x + 5) / (y - 5);
定义带参数的宏“#define JH(a,b,t) t = a; a = b; b = t”,对两个参数a、b的值进行交换,下列表述中正确的是()。 (1分)
- 不定义参数a和b将导致编译错误
- 不定义参数a、b、t将导致编译错误
- 不定义参数t将导致运行错误
- 不需要定义参数a、b、t类型
如果所有的变量按照下面的程序进行定义和声明,那么在main()函数中所有可用的变量为 ()。 (2分)
void fun(int x)
{
static int y;
……
return;
}
int z;
void main( )
{
int a,b;
fun(a);
……
}
- x,y
- x,y,z
- a,b,z
- a,b,x,y,z
如果一个变量在整个程序运行期间都存在,但是仅在说明它的函数内是可见的,这个变量的存储类型应该被说明为( )。 (1分)
- 静态变量
- 动态变量
- 外部变量
- 内部变量
下面说法中正确的是()。 (1分)
- 若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度
- 若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度
- 设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑变量生命周期问题
- 静态全局变量使用过多,可那会导致动态存储区(堆栈)溢出
凡是函数中未指定存储类别的局部变量,其隐含的存储类型为( )。 (1分)
- 自动(auto)
- 静态(static)
- 外部(extern)
- 寄存器(register)
在一个C源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是。 (1分)
- extern
- register
- auto
- static
将一个函数说明为static后,该函数将 ( )。(1分)
- 既能被同一源文件中的函数调用,也能被其他源文件中的函数调用
- 只能被同一源文件中的函数调用,不能被其他源文件中的函数调用
- 只能被其他源文件中的函数调用,不能被同一源文件中的函数调用
- 既不能被同一源文件中的函数调用,也不能被其他源文件中的函数调用
编程题:
第一题:
7-1 汉诺塔问题* (10 分)
汉诺塔是一个源于印度古老传说的益智玩具。据说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘,大梵天命令僧侣把圆盘移到另一根柱子上,并且规定:在小圆盘上不能放大圆盘,每次只能移动一个圆盘。当所有圆盘都移到另一根柱子上时,世界就会毁灭。
请编写程序,输入汉诺塔圆片的数量,输出移动汉诺塔的步骤。
输入格式
圆盘数 起始柱 目的柱 过度柱
输出格式
移动汉诺塔的步骤
每行显示一步操作,具体格式为:
盘片号: 起始柱 -> 目的柱
其中盘片号从 1 开始由小到大顺序编号。
输入样例
a c b
输出样例
: a -> c
: a -> b
: c -> b
: a -> c
: b -> a
: b -> c
: a -> c
实验代码:
#include<iostream>
using namespace std; void solve(int n , char a , char b , char c)
{
if (n == )cout << n << ": " << a << " -> " << c << endl;
else{
solve(n - , a, c, b);cout << n << ": " << a << " -> " << c <<endl;solve(n - , b, a, c);}
} int main(int argc, const char * argv[])
{
int n;
char A, B, C;
cin >> n;
cin >> A >> B >> C;
solve(n, A, C, B); return ;
}
设计思路
本题调试过程中遇到的问题及解决方法
汉诺塔问题是一道经典的递归题,一开始过渡柱和目的柱交换过程出错,及时改回。
运行结果截图
第二题
7-2 估值一亿的AI核心代码 (20 分)
以上图片来自新浪微博。
本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:
无论用户说什么,首先把对方说的话在一行中原样打印出来;
消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
把原文中所有大写英文字母变成小写,除了
I
;把原文中所有独立的
can you
、could you
对应地换成I can
、I could
—— 这里“独立”是指被空格或标点符号分隔开的单词;把原文中所有独立的
I
和me
换成you
;把原文中所有的问号
?
换成惊叹号!
;在一行中输出替换后的句子作为 AI 的回答。
输入格式:
输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。
输出格式:
按题面要求输出,每个 AI 的回答前要加上 AI:
和一个空格。
输入样例:
Hello ?
Good to chat with you
can you speak Chinese?
Really?
Could you show me
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
AI: I could show you
What Is this prime? I,don 't know
AI: what Is this prime! you,don't know
实验代码
#include<bits/stdc++.h>
using namespace std; #define MAXN 1001
void solve(string str)
{
vector<string> str_word;
cout<<str<<endl;
cout<<"AI: ";
for(int i = ; i < str.length() ; i++)
{
if(str[i]>='A'&&str[i]<='Z'){if(str[i]!='I')str[i]=str[i]-'A'+'a';}
else if((str[i]>=''&&str[i]<='')||(str[i]>='a'&&str[i]<='z'))continue;
else if(str[i]!=' '){str.insert(i," ");i++;}
if(str[i]=='?'){str[i]='!';}
}
str_word.clear();
string word="";
for(int i = ; i < str.size() ; i++)
{
if(str[i]!=' ')word+=str[i];
else if(str[i]==' '){if(word!=""){str_word.push_back(word);word="";}}
}
if(word!="")
{
str_word.push_back(word);
word="";
}
int lens_str_word = str_word.size();
for(int i=;i<lens_str_word;i++)
{
if(str_word[i]=="I"||str_word[i]=="me")str_word[i]="you";
else if(str_word[i]=="you")
{
if(i<||str_word[i-].size()==)continue;
if(str_word[i-]=="can"||str_word[i-]=="could")
{
str_word[i]=str_word[i-];
str_word[i-]="I";
}
}
} for(int i = ; i < lens_str_word ; i++){
cout<<str_word[i];
if(i==lens_str_word-)continue;
if((str_word[i+][]>='a'&&str_word[i+][]<='z')||(str_word[i+][]>=''&&str_word[i+][]<='')||(str_word[i+][]=='I'))cout<<" "; }
cout<<endl; } int main ( int argc , const char * argv[])
{
int n;
cin>>n;
getchar();
while(n--){
string str;
getline(cin,str);
solve(str);
} return ;
}
设计思路
本体调试过程中遇到的问题及解决方法
一开始don 't 和 prime! 由于都是符号在字母后面的情况且处理方式不同,所以总是出错,但发现可以将符号和字母分开单独处理,输出的时候用条件限制即可输出正确格式。
运行结果截图
第三题
在国际象棋中,皇后是最厉害的棋子,可以横走、直走,还可以斜走。棋手马克斯·贝瑟尔 1848 年提出著名的八皇后问题:即在 8 × 8 的棋盘上摆放八个皇后,使其不能互相攻击 —— 即任意两个皇后都不能处于同一行、同一列或同一条斜线上。
现在我们把棋盘扩展到 n × n 的棋盘上摆放 n 个皇后,请问该怎么摆?请编写程序,输入正整数 n,输出全部摆法(棋盘格子空白处显示句点“.”,皇后处显示字母“Q”,每两格之间空一格)。
输入格式
正整数 n (0 < n ≤ 12)
输出格式
若问题有解,则输出全部摆法(两种摆法之间空一行),否则输出 None。
要求:试探的顺序逐行从左往右的顺序进行,请参看输出样例2。
输入样例1
输出样例1
None
输入样例2
输出样例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 . . . .
这道题很神奇,答案是对的,格式一模一样,PTA提交却一直格式错误,就很迷~
实验代码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 12 int _map[MAXN][MAXN] = {};
bool flag = false ;
void print(int n)
{
for(int i=;i<=n;i++){
for(int j=;j<n;j++){
if(_map[i][j]==)
cout<<'.'<<' ';
else
cout<<'Q'<<' ';
}
if(_map[i][n]==)
cout<<'.'<<endl;
else
cout<<'Q'<<endl;
}
cout<<endl;
} bool queen_pd(int x , int y ,int n)
{
for(int i=;i<=x;i++){
if(_map[i][y]){return ;}
else{
for(int j=;j<=n;j++){
if(_map[i][j]){if(abs(i-x)==abs(j-y)){return ;}else{break;}}}
}
}
return ; } void solve(int n,int num_queen)
{
if(num_queen>n){print(n);flag = true;} else
for(int i = ; i <= n ; i++)
{ if(queen_pd(num_queen,i,n))
{
_map[num_queen][i]=;
solve(n,num_queen+);
_map[num_queen][i]=;
} } } int main ( int argc , const char * argv[])
{
int n;
cin>>n;
if(n==)cout<<'Q'<<endl;
else if(n==)cout<<"None"; else{
solve(n,);
if(!flag) cout<<"None";
}
return ;
}
设计思路
本题调试过程中遇到的问题及解决方法
格式总是错误,答案是对的。。
运行结果截图
(nmslPTA)
结对编程感想:这次题目只能靠自己理解,合作编辑代码基本靠个人能力..
学习总结: | 存在的问题 | 心得 | 完成作业消耗时间 | 本周学习内容 |
第一周 | 对文件读取数据的运用不是很熟练 | 多去看关于刷题的书籍,有助于提高自己写题能力,实在不会的可以参考大佬的代码,加以自己理解之后去默写几遍 | 半个小时左右 | 文件输入,BFS,DFS,PARTITION算法及简单的贪心算法 |
第二周 | 对单纯用数组完成双向链表的操作还是太生疏了,说明对双向链表的运作原理不熟 | 推荐两本比较好的书《挑战程序设计》《算法竞赛》 | 半个小时左右 | vector数组及list双向链表操作 |
第三周 |
指针的概念太久没记有点生疏了 | 对vector数组使用愈加熟练 | 一小时左右 | 数据结构 |
第四周 | 对联通二维数组的最大子数和自闭了 | 多看些算法,不然写题目用什么方法去解决都弄不清 | 基础题目10分钟,挑战作业现在都在自闭中 | 迭代器 |
第五周 | 最小权值路径最优解该用什么解法 | 多思考一下如何优化自己的代码,会有新的收获 | 一个小时 | 递归和分治法 |
第六周 | 指针类型的转换 | 能用数据结构解决的问题就用数据结构 | 半小时 | windows函数 |
第七周 | 指针结构体 | 对地址的概念要熟悉才能更好的运用指针和结构体 | 十分钟 | 依然是windows函数 |
第八周 | 数论,递归 | 多看数论就会变得很牛B | 2天 |
经典数论 |
系列一:代码函数 系列二:博客字数
题目---汉诺塔及AI代码及八皇后的更多相关文章
- 关于汉诺塔,C++代码,代码效果演算
1.故事介绍 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上依照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...
- python3汉诺塔简单实现代码
小时候喜欢玩汉诺塔,今天用python实现简单的汉诺塔功能 代码: def hannoi(n,x,y,z): if n==1: print(x,'-->',z) else: hannoi(n-1 ...
- 杭电oj1995——汉诺塔V(java实现)
正文之前,先说下做这题的心路历程(简直心累) 这是今天下午的第一道题 第一次看到题目标题——汉诺塔 内心OS:wc,汉诺塔诶,听名字就很难诶,没做过诶,肯定很难实现吧,不行,我得去看看讲解 然后就上b ...
- C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)
本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...
- 题目1458:汉诺塔III(不一样的汉诺塔递归算法)
题目链接:http://ac.jobdu.com/problem.php?pid=1458 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
- 九度oj 题目1458:汉诺塔III
题目描述: 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动 ...
- Hanio汉诺塔代码递归实现
1.背景介绍 Hanio (汉诺塔,又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...
- java笔记--代码实现汉诺塔移动过程和移动次数
汉诺塔 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方. --如果朋友 ...
- 算法笔记_013:汉诺塔问题(Java递归法和非递归法)
目录 1 问题描述 2 解决方案 2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...
随机推荐
- removeAttr(name)
removeAttr(name) 概述 从每一个匹配的元素中删除一个属性 1.6以下版本在IE6使用JQuery的removeAttr方法删除disabled是无效的.解决的方法就是使用$(" ...
- .net大文件上传断点续传源码
IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag 客户端每次提交下载请求时,服务 ...
- Windows:打印为PDF(PDF转换器)
造冰箱的大熊猫@cnblogs 2019/4/17 文中图片可通过点击鼠标右键查看大图 Windows下实现PDF打印的几个办法: 1.Foxit Reader(福昕PDF浏览器) 安装Foxit R ...
- 计算机HDMI端口与电视机相连
造冰箱的大熊猫@cnblogs 2019/2/27 打算通过HDMI接口将计算机桌面投影到电视机上,结果遇到问题,折腾了好一阵才搞定.现将这些问题记录下来 1.设备环境 计算机:使用Ubuntu 1 ...
- Centos 7禁止ftdi_sio模块
$ dmesg[ 3305.097301] usb 1-1: USB disconnect, device number 7[ 3306.883704] usb 1-1: new high-speed ...
- 3.Linux系统文件名字体不同的颜色都代表什么
在Linux中,文件的颜色都是有含义的.其中, Linux中文件名颜色不同,代表文件类型不一样.如下所示: 白色:表示普通文件浅蓝色:表示链接文件: 灰色:表示其他文件: 绿色:表示可执行文件: 红色 ...
- AJAX-基础-1
概述 AJAX = Asynchronous JavaScript And XML(异步 JavaScript 及 XML) AJAX 是 Asynchronous JavaScript And XM ...
- [CSP-S模拟测试]:那一天她里我而去(堆优化Dijkstra)
题目传送门(内部题3) 输入格式 每个测试点有多组测试数据.第一行有一个正整数T表示数据组数.接下来对于每组数据,第一行有两个正整数n,m分别代表图的点数和边数.接下来有m行,每行三个整数u,v,d表 ...
- 微信小程序获得unionid
一.微信小程序中app.js中: wx.login({ success: res => { if(res.code){ var code = res.code; wx.getSetting({ ...
- SpringMVC接收请求参数和页面传参
接收请求参数: 1,使用HttpServletRequest获取 @RequestMapping("/login.do") public String login(HttpServ ...