說(shuō)一下這個(gè)螺旋矩陣的實(shí)現(xiàn)方式。
專業(yè)成都網(wǎng)站建設(shè)公司,做排名好的好網(wǎng)站,排在同行前面,為您帶來(lái)客戶和效益!創(chuàng)新互聯(lián)為您提供成都網(wǎng)站建設(shè),五站合一網(wǎng)站設(shè)計(jì)制作,服務(wù)好的網(wǎng)站設(shè)計(jì)公司,網(wǎng)站制作、成都網(wǎng)站建設(shè)負(fù)責(zé)任的成都網(wǎng)站制作公司!
首先,go函數(shù)一個(gè)遞歸,這你得明白,而遞歸的實(shí)現(xiàn)原理類似于棧,也就是先進(jìn)后出的執(zhí)行方式。很多人會(huì)理解成這樣的執(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開(kāi)始一直往里面進(jìn),然后算到start = 9?
不,其實(shí)并不是這樣,恰恰相反,遞歸會(huì)不斷的往里面進(jìn),一直進(jìn)到最里層,也就是達(dá)到條件
if(startfinal) return;為止。然后開(kāi)始出棧,從start = 9開(kāi)始算,算回到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
好了,這就是以上的原理,然后再來(lái)看你的gi和gj,處理沖突這一點(diǎn)理解得很對(duì),但是不是說(shuō)什么跳到05啥的,處理沖突是這一句:
if(a[ri][rj]==0),首先,ri、rj、gi、gj都是坐標(biāo)(這兒不懂的追問(wèn))看上面的數(shù)據(jù),在start 等于9、7、5的時(shí)候,ri 、rj的值是一樣的,這也就沖突了,在start等于9的時(shí)候 ,
a[ri = 1][rj =1]已經(jīng)不等于0了,到了if語(yǔ)句肯定不成立了, 自然就走的else,然后用得坐標(biāo)就變成了gi和gj,也就是start = 7的時(shí)候, 位置就是a[gi][gj],實(shí)現(xiàn)了解決沖突的效果。
至于gi和gj什么時(shí)候+1什么時(shí)候-1這個(gè),這個(gè)需要看一下原作者的思路,通過(guò)不同的dir去控制不同的位置,沖突的g坐標(biāo)將其當(dāng)做r坐標(biāo)再去判斷是否該位置上有值,有的話繼續(xù)根據(jù)dir去尋找,一直到發(fā)現(xiàn)該位置是0,然后將其占有。
不懂的繼續(xù)追問(wèn)
//尋路_帶權(quán)重_帶障礙_最短_文件地圖_不閃------wlfryq------//
#include?stdio.h
#include?stdlib.h
#include?string.h
#include?windows.h
typedef?struct
{
int?x;
int?y;
}?_PT;
_PT?pt;
int?row=0,col=0;
//設(shè)置CMD窗口光標(biāo)位置
void?setxy(int?x,?int?y)
{
COORD?coord?=?{x,?y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),?coord);
}
//獲取當(dāng)前CMD當(dāng)前光標(biāo)所在位置
void?getxy()
{
HANDLE?hConsole?=?GetStdHandle(STD_OUTPUT_HANDLE);
COORD?coordScreen?=?{0,?0};?//光標(biāo)位置
CONSOLE_SCREEN_BUFFER_INFO?csbi;
if?(GetConsoleScreenBufferInfo(hConsole,?csbi))
{
pt.x=csbi.dwCursorPosition.X;
pt.y=csbi.dwCursorPosition.Y;
}
}
typedef?struct
{
int?x;
int?y;
int?type;
int?v;
}PT;
PT?**s=NULL,stack[50],start,end,c;
int?pos=0;
void?prt()
{
int?i,j;
system("cls");
for(i=0;irow;i++)
{
for(j=0;jcol;j++)
{
if(s[i][j].type==1)
{
printf("■");
}
else?if(i==end.x??j==end.y)
{
printf("★");
}
else?if(i==c.x??j==c.y)
{
printf("◎");
}
else
{
printf("??");
}
}
printf("\n");
}
Sleep(500);
}
void?stack_in(PT?a)
{
stack[pos++]=a;
}
PT?stack_out()
{
int?i;
PT?t;
t=stack[0];
for(i=0;ipos-1;i++)
{
stack[i]=stack[i+1];
}
pos--;
return?t;
}
void?fun()
{
PT?a;
int?x,y,v;
while(1)
{
if(pos==0)
{
break;
}
a=stack_out();
x=a.x;
y=a.y;
if(x==start.x??y==start.y)
{
break;
}
v=s[x][y].v;
if(x-1=0??s[x-1][y].type==0??(s[x-1][y].v==-1?||?s[x-1][y].vv+1))
{
s[x-1][y].v=v+1;
stack_in(s[x-1][y]);
}
if(x+1=row-1??s[x+1][y].type==0??(s[x+1][y].v==-1?||?s[x-1][y].vv+1))
{
s[x+1][y].v=v+1;
stack_in(s[x+1][y]);
}
if(y-1=0??s[x][y-1].type==0??(s[x][y-1].v==-1?||?s[x-1][y].vv+1))
{
s[x][y-1].v=v+1;
stack_in(s[x][y-1]);
}
if(y+1=col-1??s[x][y+1].type==0??(s[x][y+1].v==-1?||?s[x-1][y].vv+1))
{
s[x][y+1].v=v+1;
stack_in(s[x][y+1]);
}
}
}
void?go(int?x,?int?y)
{
printf("\n按任意鍵開(kāi)始\n");
getchar();
int?v;
while(1)
{
if(x==end.x??y==end.y)
{
setxy(0,y+2);
printf("end....");
return;
}
v=s[x][y].v;
if(v==0)
{
return;
}
if(x-1=0??s[x-1][y].v==v-1)
{
c=s[x-1][y];
setxy(y*2,x);
x=x-1;
printf("??");
setxy(y*2,x);
printf("◎");
Sleep(500);
continue;
}
else?if(x+1=row-1??s[x+1][y].v==v-1)
{
c=s[x+1][y];
setxy(y*2,x);
x++;
printf("??");
setxy(y*2,x);
printf("◎");
Sleep(500);
continue;
}
else?if(y-1=0??s[x][y-1].v==v-1)
{
c=s[x][y-1];
setxy(y*2,x);
y--;
printf("??");
setxy(y*2,x);
printf("◎");
Sleep(500);
continue;
}
else?if(y+1=col-1??s[x][y+1].v==v-1)
{
c=s[x][y+1];
setxy(y*2,x);
y++;
printf("??");
setxy(y*2,x);
printf("◎");
Sleep(500);
continue;
}
}
printf("\nreturn?go\n");
system("pause");
}
void?GetMapFromFile()
{
int?i,j,x,y,len;
char?ch[50]={'\0'};
FILE*?fp=fopen("e:\\map1.txt","r");
if(fp==NULL)
{
printf("open?file?failed.\n");
return;
}
x=0;
while(!feof(fp))
{
fgets(ch,50,fp);
row++;
}
col=strlen(ch);
fseek(fp,0L,SEEK_SET);
while(!feof(fp))
{
fgets(ch,50,fp);
if(s==NULL)
{
len=strlen(ch);
for(i=len-1;i0;i--)
{
if(ch[i]!='0'??ch[i]!='1')
{
ch[i]='\0';
}
else
{
break;
}
}
len=strlen(ch);
s=(PT**)malloc(sizeof(PT*)*row);
for(j=0;jlen;j++)
{
*(s+j)=(PT*)malloc(sizeof(PT)*len);
}
}
y=0;
for(i=0;ilen;i++)
{
s[x][y].type=ch[i]-48;
s[x][y].x=x;
s[x][y].y=y;
s[x][y].v=-1;
y++;
}
x++;
}
start=s[row-2][1];
end=s[row-2][len-2];
fclose(fp);
}
int?main()
{
GetMapFromFile();
int?i,j;
int?x,y;
x=end.x;
y=end.y;
s[x][y].v=0;
stack_in(end);
fun();
c=start;
prt();
go(start.x,start.y);
return?0;
}
一、在keil中調(diào)試c語(yǔ)言程序
1、打開(kāi)我們的程序,點(diǎn)擊菜單欄右側(cè)的start/stopdebug..按鈕,進(jìn)入調(diào)試模式,如下圖。
2、左側(cè)為寄存器窗口,右上方是匯編窗口,我們可以看到各個(gè)寄存器的數(shù)值和c語(yǔ)言對(duì)應(yīng)的匯編代碼,如下圖。
3、點(diǎn)擊單步執(zhí)行按鈕或者點(diǎn)擊f11、f10,都可以進(jìn)入單步執(zhí)行模式,方便我們看程序流程和執(zhí)行步驟,如下圖。
4、點(diǎn)擊菜單欄的串口按鈕,我們來(lái)調(diào)試串口的輸出,這里有很多對(duì)應(yīng)的調(diào)試工具可供選擇,如下圖。
5、單步執(zhí)行,我們看到各個(gè)窗口的變化,當(dāng)直行到輸出時(shí),可以看到串口窗口有相應(yīng)的字符輸出,如下圖。
6、再次點(diǎn)擊start/stop按鈕來(lái)停止調(diào)試,如下圖。
二、用vs2012對(duì)C語(yǔ)言進(jìn)行調(diào)試
1、要對(duì)編程環(huán)境左邊的一條豎直的空開(kāi)的地方進(jìn)行點(diǎn)擊,點(diǎn)擊的是你要調(diào)試的相應(yīng)的語(yǔ)句。
2、點(diǎn)擊窗口上方的工具欄的調(diào)試界面,點(diǎn)擊逐語(yǔ)句或逐過(guò)程,都沒(méi)關(guān)系。
3、開(kāi)始調(diào)試,在調(diào)試過(guò)程中每個(gè)調(diào)試語(yǔ)句都要按一次F5鍵,在鍵盤(pán)上按下,你可以看到執(zhí)行的當(dāng)前的語(yǔ)句中,左邊位置的紅點(diǎn)有個(gè)箭頭。
4、在每次調(diào)試語(yǔ)句中,變量值發(fā)生改變時(shí),下方的小界面都會(huì)顯示出來(lái),看是否正確。
5、不斷地重復(fù)這個(gè)步驟,知道發(fā)現(xiàn)錯(cuò)誤的地方為止。
6、發(fā)現(xiàn)錯(cuò)誤后,停止調(diào)試,修改相應(yīng)的代碼,即完成此次調(diào)試。
start:這樣寫(xiě)是標(biāo)簽的意思,后面使用goto語(yǔ)句表示轉(zhuǎn)到某標(biāo)簽,如goto start;就是又轉(zhuǎn)到標(biāo)簽start那兒執(zhí)行了。goto語(yǔ)句在C語(yǔ)言是很少用的,因?yàn)槌绦蛞淮缶秃苋菀壮霈F(xiàn)bug,很多C語(yǔ)言書(shū)都說(shuō)不推薦使用了。
c語(yǔ)言里沒(méi)有沒(méi)有start()函數(shù),start()函數(shù)屬于用戶的自定義函數(shù);
用戶自定義函數(shù)是指如果要在公式或計(jì)算中使用特別復(fù)雜的計(jì)算,而工作表函數(shù)又無(wú)法滿足需要,則需要?jiǎng)?chuàng)建用戶自定義函數(shù)。這些函數(shù),稱為用戶自定義函數(shù)。
C語(yǔ)言是一門(mén)通用計(jì)算機(jī)編程語(yǔ)言,應(yīng)用廣泛。C語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語(yǔ)言。