這個做業屬於哪一個課程 | C語言程序設計II |
這個做業要求在哪裏 | 2019年春季學期第十一週做業 |
我在這個課程的目標是 | 我但願可以經過學習C語言的知識,編寫程序 |
這個做業在哪一個具體方面幫助我實現目標 | 這個做業讓我知道了對相對複雜的問題,合理定義程序的多函數結構;可以使用遞歸函數進行編程;掌握宏的基本用法;掌握編譯預處理的概念 |
參考文獻 | 【基礎算法】回溯法與八皇后問題 |
7-1 漢諾塔問題* (10 分)
漢諾塔是一個源於印度古老傳說的益智玩具。聽說大梵天創造世界的時候作了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤,大梵天命令僧侶把圓盤移到另外一根柱子上,而且規定:在小圓盤上不能放大圓盤,每次只能移動一個圓盤。當全部圓盤都移到另外一根柱子上時,世界就會毀滅。html
請編寫程序,輸入漢諾塔圓片的數量,輸出移動漢諾塔的步驟。ios
輸入格式算法
圓盤數 起始柱 目的柱 過分柱
輸出格式編程
移動漢諾塔的步驟 每行顯示一步操做,具體格式爲: 盤片號: 起始柱 -> 目的柱 其中盤片號從 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
#include<stdio.h> void hanio(int n, char a, char b, char c); int main() { int n; char a, b, c; scanf("%d\n", &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", n, a, b); } else { hanio(n-1, a, c, b); printf("%d: %c -> %c\n", n, a, b); hanio(n-1, c, b, a); } }
7-2 估值一億的AI核心代碼 (20 分)
學習
本題要求你實現一個稍微更值錢一點的 AI 英文問答程序,規則是:this
不管用戶說什麼,首先把對方說的話在一行中原樣打印出來;
消除原文中多餘空格:把相鄰單詞間的多個空格換成 1 個空格,把行首尾的空格所有刪掉,把標點符號前面的空格刪掉;
把原文中全部大寫英文字母變成小寫,除了 I;
把原文中全部獨立的 can you、could you 對應地換成 I can、I could—— 這裏「獨立」是指被空格或標點符號分隔開的單詞;
把原文中全部獨立的 I 和 me 換成 you;
把原文中全部的問號 ? 換成驚歎號 !;
在一行中輸出替換後的句子做爲 AI 的回答。
輸入格式:
輸入首先在第一行給出不超過 10 的正整數 N,隨後 N 行,每行給出一句不超過 1000 個字符的、以回車結尾的用戶的對話,對話爲非空字符串,僅包括字母、數字、空格、可見的半角標點符號。spa
輸出格式:
按題面要求輸出,每一個 AI 的回答前要加上 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
看了別的大佬的博客後有了本身的一點思路,可是仍是沒有作出來
是我太菜了😥
7-3 ***八皇后問題 (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 . . . .
想了好久都沒思路,因此去網上拜讀了一下,找到了一個我以爲最好的辦法(雖然是用C++寫的😂),因此有點看不太懂,但主要的函數看懂了,但和咱們的題目不太同樣,我不會轉換Q的位置。因此又失敗了。。。
參考博文:【基礎算法】回溯法與八皇后問題
7-1 求迷宮最短通道 (20 分)
遞歸求解迷宮最短通道的總步長。輸入一個迷宮,求從入口通向出口的可行路徑中最短的路徑長度。爲簡化問題,迷宮用二維數組 int maze[10][10]來存儲障礙物的分佈,假設迷宮的橫向和縱向尺寸的大小是同樣的,並由程序運行讀入, 若讀入迷宮大小的值是n(3<n<=10),則該迷宮橫向或縱向尺寸都是n,規定迷宮最外面的一圈是障礙物,迷宮的入口是maze[1][1],出口是maze[n-2][n-2], 若maze[i][j] = 1表明該位置是障礙物,若maze[i][j] = 0表明該位置是能夠行走的空位(0<=i<=n-1, 0<=j<=n-1)。求從入口maze[1][1]到出口maze[n-2][n-2]能夠走通的路徑上經歷的最短的總步長。要求迷宮中只容許在水平或上下四個方向的空位上行走,走過的位置不能重複走。
輸入格式:
輸入迷宮大小的整數n, 以及n行和n列的二維數組(數組元素1表明障礙物,0表明空位)
輸出格式:
如有可行的通道則輸出一個整數,表明求出的通道的最短步長;若沒有通道則輸出"No solution"
輸入樣例:
10 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 1 0 0 1 1 0 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
上述輸入表明的是以下這樣一個迷宮:
其中紅色的小方塊是障礙物,藍色的小方塊是空位,白色的小圓連起來是一條從入口到出口的通道,兩個圓之間表明一個步長。
輸出樣例:
14
總結來講就是我好菜😭
第十二週的教學內容是:第十一章 指針進階
請你們查閱資料,思考以下問題:
請舉實例解釋如下幾個概念:數組指針,指針數組,指針函數,函數指針,二級指針,單向鏈表。(無實例不給分)
請用本身的理解回答。若是有引用他人的文字,請必定要標出出處(使用Markdown的連接方式)。
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int (*p)[4]; p=(int(*)[4])a; for(int i=0;i<3;i++) { for(int j=0;j<4;j++) printf("%d",p[i][j]); //或者 *(*(p+i)+j) 或者 *(p[i]+j) printf("\n"); }
引用自數組指針百度百科
char char *z[6] = {"a","b","c","d","e","f"};
int *hanshu(int, int);
hanshu被定義後以整型的形式返回
#include<iostream> using namespace std; int main() { float*find(float(*p)[4],int m);//查詢序號爲m的學生的四門課程的成績 float score[][4]={{50,51,52,55},{70,70,40,80},{77,99,88,67}};//定義成績數組,第一維能夠爲變量 float*pf=NULL;//定義一個指針時必定要初始化 int i,m; cout<<"請輸入您想查詢的學生的序號:"; cin>>m; pf=find(score,m);//返回爲一維數組指針,指向一個學生成績 for(i=0;i<4;i++) cout<<*(pf+i)<<""; cout<<endl; return 0; } float *find(float(*p)[4],int m) { float *pf=NULL; pf=*(p+m);//p是指向二維數組的指針,加*取一維數組的指針 return pf; }
學生學號從0號算起,函數find()被定義爲指針函數,其形參pointer是指針指向包含4個元素的一維數組的指針變量。pf是一個指針變量,它指向浮點型變量。main()函數中調用find()函數,將score數組的首地址傳給pointer.
引用自函數指針百度百科
int a=1234; int *p=a; int **pq=&p;
pq指向p,就稱爲二級指針
列表是由結點構成,head指針指向第一個成爲表頭結點,而終止於最後一個指向NULL的指針。
struct stu{ int num; char name[20]; int score; struct stu*next };
設置不一樣的結點
周/日期 | 這周所花的時間 | 代碼行數 | 學到的知識點簡介 | 目前比較迷惑的問題 |
---|---|---|---|---|
3/2-3/8 | 20h | 300行 | 數組,指針的大體意義,文件入門 | 數組串的使用,指針 |
3/9-3/15 | 25h | 400行 | 二維數組,文件與數組的結合運用 | 雙for循環的流程圖(再不上課,光自學感受太艱難了) |
3/16-3/22 | 22h | 450行 | 一維數組,二維數組,幾種數組排序法 | 字符串使用 |
3/23-3/29 | 20h | 350行 | 字符串的定義及其使用 | 指針的具體使用 |
3/30-4/5 | 15h | 340行 | 指針變量的定義,使用,初始化及其基本運算,指針做爲函數參數的做用;使用指針實現函數調用返回多個值 | 指針在運行時內存的變化 |
4/6-4/12 | 13h | 400行 | 數組名做爲函數參數的用法,理解指針、數組和地址之間的關係,指針和數組能夠實現相同的操做,結構體的定義,使用 | 結構體的具體使用,結構體的流程圖 |
4/13-4/19 | 18h | 500行 | 經常使用字符串函數以及使用指針操做字符串的方法,掌握動態內存分配 | 結構體的流程圖 |
4/20-4/26 | 13h | 400行 | 根據實際狀況合理定義結構,可以使用結構變量與結構數組進行熟練編程,掌握結構指針的操做,並應用於函數傳遞 | 遞歸函數 |
5/3-5/10 | 10h | 300行 | 掌握宏的基本用法;掌握編譯預處理的概念 | 本週做業 |