企業(yè)網(wǎng)站建設(shè)怎么選擇空間百度關(guān)鍵詞優(yōu)化平臺(tái)
前言:內(nèi)容包括:題目,代碼實(shí)現(xiàn),大致思路,代碼解讀
題目:
“福”字倒著貼,寓意“福到”。不論到底算不算民俗,本題且請(qǐng)你編寫(xiě)程序,把各種漢字倒過(guò)來(lái)輸出。這里要處理的每個(gè)漢字是由一個(gè) N?×?N 的網(wǎng)格組成的,網(wǎng)格中的元素或者為字符?@
?或者為空格。而倒過(guò)來(lái)的漢字所用的字符由裁判指定。
輸入格式:
輸入在第一行中給出倒過(guò)來(lái)的漢字所用的字符、以及網(wǎng)格的規(guī)模 N (不超過(guò)100的正整數(shù)),其間以 1 個(gè)空格分隔;隨后 N 行,每行給出 N 個(gè)字符,或者為?@
?或者為空格。
輸出格式:
輸出倒置的網(wǎng)格,如樣例所示。但是,如果這個(gè)字正過(guò)來(lái)倒過(guò)去是一樣的,就先輸出bu yong dao le
,然后再用輸入指定的字符將其輸出。
輸入樣例 1:
$ 9@ @@@@@
@@@ @@@ @ @ @
@@@ @@@
@@@ @@@@@
@@@ @ @ @
@@@ @@@@@@ @ @ @@ @@@@@
輸出樣例 1:
$$$$$ $
$ $ $ $
$$$$$ $$$
$ $ $ $$$
$$$$$ $$$$$$ $$$$ $ $ $$$ $$$
$$$$$ $
輸入樣例 2:
& 3
@@@@
@@@
輸出樣例 2:
bu yong dao le
&&&&
&&&
代碼實(shí)現(xiàn):
#include<stdio.h>
int main()
{char ch = 0;int n = 0;char arr[100][100]={0};scanf("%c %d",&ch,&n);int flag=1;getchar();int i = 0;//存入漢字for(i=0;i<n;i++){int j = 0;for(j=0;j<n;j++){arr[i][j]=getchar();}getchar();}//判斷正過(guò)來(lái)和倒過(guò)去是否一樣for(i=0;i<n;i++){int j = 0;for(j=0;j<n;j++){if(arr[i][j]!=arr[n-i-1][n-j-1]){flag=0;}}}if(flag==1){printf("bu yong dao le\n");}//倒序打印+逆序打印for(i=n-1;i>=0;i--){int j = 0;for(j=n-1;j>=0;j--){if(arr[i][j]==32){printf(" ");}else{printf("%c",ch);}}printf("\n");}return 0;
}
大致思路:
?1 要實(shí)現(xiàn)漢字倒過(guò)來(lái)的效果:需要從最后一行開(kāi)始打印,并逆序這一行,使用循環(huán)
?2 判斷正過(guò)來(lái)倒過(guò)去是否一樣:
? ? 某一行和其對(duì)應(yīng)的行數(shù)(某一行的下標(biāo)+它對(duì)應(yīng)的行數(shù)的下標(biāo)=總行數(shù)-1)進(jìn)行比較,
? ? 某一行的最開(kāi)始的字符和對(duì)應(yīng)的行數(shù)的最后的字符比較,然后依次遍歷比較,若是發(fā)現(xiàn)有不相同的則說(shuō)明有必要倒置,若是發(fā)現(xiàn)全部都相同,則打印無(wú)需倒置的信息:bu yong dao le? 比如:
?
?總行數(shù)是3 第一行的下標(biāo)是0 ,其對(duì)應(yīng)的行數(shù)是第三行,下標(biāo)為2? ? ?0+2=3-1
? 紅色方框之間進(jìn)行比較,橙色方框之間進(jìn)行比較
代碼解讀:
part 1
char ch = 0;int n = 0;char arr[100][100]={0};scanf("%c %d",&ch,&n);int flag=1;getchar();
使用二維數(shù)組arr存儲(chǔ)組成漢字的字符
使用flag來(lái)標(biāo)記正過(guò)來(lái)和倒過(guò)去的字符是否相同,若是相同則flag還是初始值1,若是不同則flag置成0
注意:在輸入二維數(shù)組的行數(shù)和列數(shù)后(使用的都是同一個(gè)數(shù)字)需要使用getchar讀走數(shù)字后的\n
這樣在下面使用getchar一個(gè)一個(gè)讀取用戶輸入的字符后,確保讀取的都是有效字符
part 2:存入漢字
int i = 0;for(i=0;i<n;i++){int j = 0;for(j=0;j<n;j++){arr[i][j]=getchar();}getchar();}
使用getchar一個(gè)一個(gè)字符的讀取
注意:在讀取完一行的字符后,需要再使用一個(gè)getchar讀走換行符\n
part 2:判斷正過(guò)來(lái)和倒過(guò)去的漢字是否一樣
//判斷正過(guò)來(lái)和倒過(guò)去是否一樣for(i=0;i<n;i++){int j = 0;for(j=0;j<n;j++){if(arr[i][j]!=arr[n-i-1][n-j-1]){flag=0;}}}
比如?
?我們現(xiàn)在要判斷整個(gè)矩陣正過(guò)來(lái)和倒過(guò)去是否一樣,需要行數(shù)之間兩兩比較:
行數(shù)0和行數(shù)2比較? 行數(shù)1 和行數(shù)1比較
因?yàn)?+2=總行數(shù)3-1? ?1+1=總行數(shù)3-1
行數(shù)之間的兩兩比較:由于倒過(guò)去的漢字是以正著的漢字的最后一行的最后一個(gè)字符作為第一行的第一個(gè)字符,故而我們需要兩行的字符交叉比較
紅色方框之間比較,橙色方框之間比較……
part 3:倒序+逆序打印
if(flag==1){printf("bu yong dao le\n");}//倒序打印+逆序打印for(i=n-1;i>=0;i--){int j = 0;for(j=n-1;j>=0;j--){if(arr[i][j]==32){printf(" ");}else{printf("%c",ch);}}printf("\n");}
倒過(guò)來(lái)的漢字是從正著的漢字的最后一行開(kāi)始打印,并且需要逆序這一行的字符
空格的ASCII碼值是32,若是二維數(shù)組中的某個(gè)空間存放的是空格,則輸出空格