可以弄一個演示程序
創(chuàng)新互聯(lián)公司專注于網(wǎng)站建設(shè)|成都網(wǎng)站維護公司|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計與制作經(jīng)驗,為許多企業(yè)提供了網(wǎng)站定制設(shè)計服務(wù),案例作品覆蓋木屋等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷售的產(chǎn)品,結(jié)合品牌形象的塑造,量身制作品質(zhì)網(wǎng)站。
#includestdio.h
int?s[20][20],N;
void?output()
{
int?i,j;
for(i=0;?iN;?i++)
{
for(j=0;?jN;?j++)
printf("%4d?",s[i][j]);
putchar('\n');
}
}
main()
{
int?i=0,j=0,k=1,n;
printf("input?a?number:");?/*輸入n*n階的n*/
scanf("%d",N);
for(n=0;?n(N+1)/2;?n++)
{
while(jN-n)?//?這里是向右
s[i][j++]=k++;
i++;
j--;
while(iN-n)?//?這里是向下
s[i++][j]=k++;
i--;
j--;
while(j=n)?//?這里是向左
s[i][j--]=k++;
i--;
j++;
while(in)?//?這里是向上
s[i--][j]=k++;
i++;
j++;
printf("n=%d?時候\n",n);
output();
}
}
可以看到是依此一層一層填充的。
#include iostream
#include iomanip
using namespace std;
void snake(int *a, int n){
int i,j,m,tag=0; //tag表示此時方向,0、1、2、3分別代表向右、下、左、上
i=0, j=0;
*(a+i*n+j)=1;
j++;
for(m=2; m=n*n; m++){
*(a+i*n+j)=m;
switch(tag){
case 0: //向右
if(j==n-1 || *(a+i*n+j+1)!=0)
i++, tag=1;
else
j++;
break;
case 1: //向下
if(i==n-1 || *(a+(i+1)*n+j)!=0)
j--, tag=2;
else
i++;
break;
case 2: //向左
if(j==0 || *(a+i*n+j-1)!=0)
i--, tag=3;
else
j--;
break;
case 3: //向上
if(i==0 || *(a+(i-1)*n+j)!=0)
j++, tag=0;
else
i--;
break;
}
}
cout"\n矩陣如下:\n";
for(i=0; in; i++){
coutendl;
for(j=0; jn; j++)
coutsetw(4)setfill(' ')*(a+i*n+j);
}
cout endl endl;
}
int main(){
int n;cout"請輸入矩陣行數(shù):";
cinn;
int *m=new int[n*n];
int i,j;
for(i=0; in; i++)
for(j=0; jn; j++)
*(m+i*n+j)=0;
snake(m,n);
return 0;
}
說一下這個螺旋矩陣的實現(xiàn)方式。
首先,go函數(shù)一個遞歸,這你得明白,而遞歸的實現(xiàn)原理類似于棧,也就是先進后出的執(zhí)行方式。很多人會理解成這樣的執(zhí)行方式:
ri = 1, rj = 2, gi = 0, gj = 1, start = 2, dir = 0
ri = 2, rj = 2, gi = 1, gj = 3, start = 3, dir = 1
ri = 2, rj = 1, gi = 3, gj = 2, start = 4, dir = 2
ri = 1, rj = 1, gi = 2, gj = 0, start = 5, dir = 3
ri = 1, rj = 0, gi = 2, gj = -1, start = 6, dir = 3
ri = 1, rj = 1, gi = 0, gj = 0, start = 7, dir = 0
ri = 0, rj = 1, gi = -1, gj = 0, start = 8, dir = 0
ri = 1, rj = 1, gi = 0, gj = 2, start = 9, dir = 1
從start = 2開始一直往里面進,然后算到start = 9?
不,其實并不是這樣,恰恰相反,遞歸會不斷的往里面進,一直進到最里層,也就是達到條件
if(startfinal) return;為止。然后開始出棧,從start = 9開始算,算回到start = 8.。。一直到start = 2結(jié)束。
也就是最后的執(zhí)行順序應(yīng)該是:
ri = 1, rj = 1, gi = 0, gj = 2, start = 9, dir = 1
ri = 0, rj = 1, gi = -1, gj = 0, start = 8, dir = 0
ri = 1, rj = 1, gi = 0, gj = 0, start = 7, dir = 0
ri = 1, rj = 0, gi = 2, gj = -1, start = 6, dir = 3
ri = 1, rj = 1, gi = 2, gj = 0, start = 5, dir = 3
ri = 2, rj = 1, gi = 3, gj = 2, start = 4, dir = 2
ri = 2, rj = 2, gi = 1, gj = 3, start = 3, dir = 1
ri = 1, rj = 2, gi = 0, gj = 1, start = 2, dir = 0
好了,這就是以上的原理,然后再來看你的gi和gj,處理沖突這一點理解得很對,但是不是說什么跳到05啥的,處理沖突是這一句:
if(a[ri][rj]==0),首先,ri、rj、gi、gj都是坐標(這兒不懂的追問)看上面的數(shù)據(jù),在start 等于9、7、5的時候,ri 、rj的值是一樣的,這也就沖突了,在start等于9的時候 ,
a[ri = 1][rj =1]已經(jīng)不等于0了,到了if語句肯定不成立了, 自然就走的else,然后用得坐標就變成了gi和gj,也就是start = 7的時候, 位置就是a[gi][gj],實現(xiàn)了解決沖突的效果。
至于gi和gj什么時候+1什么時候-1這個,這個需要看一下原作者的思路,通過不同的dir去控制不同的位置,沖突的g坐標將其當做r坐標再去判斷是否該位置上有值,有的話繼續(xù)根據(jù)dir去尋找,一直到發(fā)現(xiàn)該位置是0,然后將其占有。
不懂的繼續(xù)追問
1. 編程,統(tǒng)計在所輸入的50個實數(shù)中有多少個正數(shù)、多少個負數(shù)、多少個零。
2. 編程,計算并輸出方程X2+Y2=1989的所有整數(shù)解。
3. 編程,輸入一個10進制正整數(shù),然后輸出它所對應(yīng)的八進制、十六進制數(shù)。
4. 一個數(shù)如恰好等于它的因子之和,這個數(shù)就稱為“完數(shù)”。編程序找出1000以內(nèi)的所有完數(shù),并輸出其因子(6是一個"完數(shù)",它的因子是1,2,3)。
5. 輸入一個正整數(shù),輸出它的所有質(zhì)數(shù)因子(如180的質(zhì)數(shù)因子為 2、2、3、3、5)。
6. 輸入20個整數(shù)存入一數(shù)組,輸出其中能被數(shù)組中其它元素整除的那些數(shù)組元素。
7. 輸入兩個數(shù)組(數(shù)組元素個數(shù)自定),輸出在兩個數(shù)組中都出現(xiàn)的元素(如a[5]=,b[6]=,則輸出3、5)。
8. 輸入兩個數(shù)組(數(shù)組元素個數(shù)自定),輸出在兩個數(shù)組中都不出現(xiàn)的元素(如a[5]=,b[6]=,則輸出2、4、6、3、7、9、10、-1)。
9.編程,將字符數(shù)組S2中的全部字符拷貝到字符數(shù)組S1中(不用strcpy函數(shù))。
10.給定年份year,判別該年份是否閏年(定義一個宏以判別該年份是否閏年)。
11.輸入一行小寫字母后,將字母變成其下一字母(a變成b、b變成c、c變成d、…、x變成y、y變成z、z變成a)輸出。
12. 編寫一個函數(shù),處理n行、n列的二維數(shù)組:將每一行的元素同除以該行上絕對值最大的元素。
13. 編寫函數(shù),求任意階多項式 a0+a1X+a2X2+...+anXn 的值并返回多項式的值。
14. 設(shè)計一個函數(shù),使給出一個數(shù)的原碼,能得到該數(shù)的補碼。
15. 編寫函數(shù),求m行、n列的二維數(shù)組全體元素中負數(shù)的個數(shù)。
16. 編寫函數(shù),返回在一個整數(shù)組中出現(xiàn)次數(shù)最多的數(shù)及其出現(xiàn)次數(shù)。
17.編一個程序,打入月份號,輸出該月的英文月名,要求用指針數(shù)組處理。
18.編寫遞歸函數(shù),將輸入的字符串按與輸入相反的順序輸出。
19. 編寫函數(shù),在n個元素的一維數(shù)組中,統(tǒng)計比相鄰元素大的數(shù)組元素個數(shù)并將統(tǒng)計數(shù)返回(不考慮a[0]和a[n-1]),要求以指針變量而不是數(shù)組名作參數(shù)。
20. 編寫函數(shù),在n個元素的一維數(shù)組中,找出最大值、最小值并傳送到調(diào)用函數(shù)。
21. 編寫一個函數(shù),統(tǒng)計m行n列二維數(shù)組中有多少個正數(shù)、多少個負數(shù),多少個零,并返回統(tǒng)計結(jié)果。
22. 寫一函數(shù),在給定的一行以"."結(jié)束的字符中,找出最長的單詞并輸出。
23. 編寫一個函數(shù)print,打印一個學(xué)生的成績數(shù)組,該數(shù)組中有5個學(xué)生的數(shù)據(jù)記錄,每個記錄包括num,name,score[3],用主函數(shù)輸入這些記錄,用print函數(shù)輸出這些記錄。
24. 把文本文件d1.dat復(fù)制到文本文件d2.dat中,要求僅復(fù)制d1.dat中的英文字符。
25. 編程,把文本文件d1.dat復(fù)制到d2.dat(其中空格字符不復(fù)制)。
26. 編程,把文本文件d1.dat復(fù)制到d2.dat(其中大寫英文字母要轉(zhuǎn)換為小寫字母)。
27. 把文本文件d1.dat復(fù)制到文本文件d2.dat中,要求僅復(fù)制d1.dat中除英文字符和數(shù)字以外的其它內(nèi)容。
28. 求出1至100之間的素數(shù)(只能被1和自身整除的數(shù))并順序?qū)懭胛募u.dat。
29.磁盤文件a1和a2,各自存放一個已按字母順序排好的字符串,編程合并二個文件到a3文件中,合并后仍保持字母順序(如a1中存放:"accel",a2中存放"ilrz",則a3中為"acceillrz")。
30.已知順序文件C.DAT 存放著程序設(shè)計基礎(chǔ)的考試成績,每個記錄包含學(xué)號(8位字符)和成績(三位整數(shù))兩個數(shù)據(jù)項。編制程序,從文件中讀入學(xué)生成績,將大于或等于60分的學(xué)生成績再形成一個新的文件SCORE60.DAT保存在A盤上,并顯示出學(xué)生總?cè)藬?shù)(少于1000)、平均成績和及格人數(shù)。
31.已知head指向一個帶頭結(jié)點的單向鏈表,鏈表中每個結(jié)點包含數(shù)據(jù)域和指針域。請編寫程序?qū)崿F(xiàn)如圖所示鏈表的逆置。
若原鏈表為:
head
a
b
C ∧
逆置后鏈表應(yīng)為:
head
c
b
a ∧
32、編制函數(shù)實現(xiàn)在一個帶頭結(jié)點(head)的單向鏈表(數(shù)據(jù)有序)中刪除相同數(shù)據(jù)的結(jié)點(相同數(shù)據(jù)的結(jié)點只保留一個)。
33、編制一程序,將字符computer賦給一個字符數(shù)組,然后從第一個字母開始間隔的輸出該串。請用指針完成。
34、編制一程序,將字符串的第m個字符開始的全部字符復(fù)制成另一個字符串,要求在主函數(shù)中輸入字符串及m的值并輸出復(fù)制結(jié)果,在被調(diào)用函數(shù)中完成復(fù)制。
35、有4名學(xué)生每個學(xué)生考4門課程,要求在用戶輸入學(xué)生學(xué)號以后能輸出該生的全部成績,用指針型函數(shù)來實現(xiàn)。請編寫函數(shù)float *search().
main()
,,,};
float search(),p;
int I,m;
printf(“enter the number of student:”);
scanf(“%d”,m);
printf(“the score of NO.%dare:\n”,m);
p=search(score,m);
for(I=0;I4;I++)
printf(“%52f\t”,*(p+I));
}
float search(float (pointer)[4],int n)
{}
36、有4名學(xué)生每個學(xué)生考4門課程,要求在用戶找出有不及格課程的學(xué)生學(xué)號并輸出全部成績,用指針來實現(xiàn)。
37、編制一程序?qū)崿F(xiàn)將十進制數(shù)轉(zhuǎn)換成二進制數(shù),并存放于一維數(shù)組b中,然后輸出。
38、以下函數(shù)p的功能是用遞歸方法計算x的n階勒讓德多項式的值。已有有調(diào)用語句p(n,x);請編寫p函數(shù)。遞歸公式如下:
1
X
PX(X)=
((2N-1)*X* Pn-1(X)-(n-1)* Pn-2(X)/n
39、編程實現(xiàn)如下5*5階的螺旋方陣。
1
2
3
4
5
16
17
18
19
6
15
22
21
20
7
14
23
24
25
8
13
12
11
10
9
40、編一程序?qū)崿F(xiàn)求所有不超過200的N值,N的平方是具有對稱性質(zhì)的回文數(shù)。所謂回文數(shù)就是將一個數(shù)從左向右與從右向左讀是一樣的,例如34543和1234321都是回文數(shù)。
41、編寫一函數(shù)實現(xiàn)將一個整數(shù)按逆序存放到一個數(shù)組中。
42、請編寫程序:從鍵盤輸入一個字符串,將其中的小寫字母全部轉(zhuǎn)換成大寫字母,輸出到磁盤文件“upper.txt”中去保存。輸入的字符串以“!”結(jié)束。
43、設(shè)文件number.dat中存放了一組整數(shù)。請編程統(tǒng)計并輸出文件中正整數(shù)、負整數(shù)和零的個數(shù)。
44、請編程:從鍵盤上讀入一個16進制無符號數(shù)m,調(diào)用函數(shù)rightrot將m中的原始數(shù)據(jù)循環(huán)右移n位。并輸出移位前后的內(nèi)容。
45、設(shè)計一遞歸函數(shù)計算下列函數(shù):
PX(X,N)=X-X2+X3-X4+……+(-1)N-1XN(N0)
46、設(shè)計一遞歸函數(shù)計算x的n次方。
47、設(shè)計一遞歸函數(shù)實現(xiàn)將小于32768的整數(shù)按逆序輸出。
48、設(shè)計一遞歸函數(shù)實現(xiàn)將小于32768的整數(shù)按逆序輸出。
49、設(shè)計一遞歸函數(shù)實現(xiàn)如下函數(shù):
ack(m,n)= n+1 當m=0時
ack(m-1,1) 當n=0時
ack(m-1,ack(m,n-1)) 當n0,m0時
50、設(shè)計一遞歸函數(shù)實現(xiàn)將任一正整數(shù)轉(zhuǎn)達換成二進制數(shù)。