2017-03-19

#include

#include

#include

#include

#define MAX_WIDTH ? ?30

#define MAX_HEIGHT ? 30

typedef struct _step

{

? ?int x; ? ? ? ? ? ?//行坐標

? ?int y; ? ? ? ? ? ?//列坐標

}STEP;

typedef struct _matrix

{

? ?int data[MAX_WIDTH+2][MAX_WIDTH+2]; //迷宮數據,0:表示有路,1:表示墻

? ?int width; ? ? ? ? ? ? ? ?//矩陣(迷宮)的寬,包括最左和最有2堵墻

? ?int height; ? ? ? ? ? ? ? ?//矩陣(迷宮)的寬,包括頂部和底部2堵墻

? ?STEP entrance; ? ? ? ? ? ? ? ?//迷宮入口

? ?STEP exit; ? ? ? ? ? ? ? ?//迷宮出口

}MATRIX;

MATRIX g_matrix= ? ? ? ? ? ? ? ?//初始化為一個迷宮,程序也能從文件中讀入迷宮數據

{

? ?{

? ? ? ?{1, 1, 1, 1, 1, 1, 1},

? ? ? ?{1, 0, 0, 0, 0, 0, 1},

? ? ? ?{1, 1, 0, 1, 0, 1, 1},

? ? ? ?{1, 0, 0, 1, 1, 1, 1},

? ? ? ?{1, 0, 1, 0, 0, 0, 1},

? ? ? ?{1, 0, 0, 0, 1, 0, 1},

? ? ? ?{1, 1, 1, 1, 1, 1, 1},

? ?},

? ?7,7, ? ? ? ? ? ? ? ? ? ?//7行,7列,包括4堵墻

? ?{1,1}, ? ? ? ? ? ? ? ? ? ?//入口坐標

? ?{5,5} ? ? ? ? ? ? ? ? ? ?//出口坐標

};

static STEP ?s_shift[]=

{

? ?{1,0}, ? ? ? ?//向右走, x++, y 不變

? ?{0,1}, ? ? ? ?//向下走, ?x 不變, y++

? ?{-1,0}, ? ? ? ?//向左走, ?x--, y不變

? ?{0,-1} ? ? ? ?//向上走, ?x 不變, y--

};

void print_paths(STEP path[],int path_len) //打印走迷宮的路徑

{

? ?int i;

? ?for (i=0;i

? ?{

? ? ? ?if (i>0)

? ? ? ? ? ?printf("->");

? ? ? ?printf("(%d,%d)",path[i].x, path[i].y);

? ?}

}

void print_Matrix(MATRIX* pMatrix) ? ? ? ?//打印迷宮數據,迷宮數據包含4堵墻

{

? ?int i,j;

? ?for (i=0;iheight;i++)

? ?{

? ? ? ?for (j=0;jwidth;j++)

? ? ? ?{

? ? ? ? ? ?if (j!=0)

? ? ? ? ? ? ? ?printf(" ");

? ? ? ? ? ?printf("%d",pMatrix->data[i][j]);

? ? ? ?}

? ? ? ?printf("\n");

? ?}

}

int search_path(int matric[MAX_WIDTH+2][MAX_WIDTH+2],

? ? ? ? ? ? ? ?STEP path[],int path_len,STEP exit)

{

? ?while (1)

? ?{

? ? ? ?int i,bFind;

? ? ? ?STEP newPos;

for (bFind=0,i=0;i<4;i++) ?//從右,下,左,上,查找新的可以走的位置

{

newPos.x = path[path_len-1].x + s_shift[i].x;

newPos.y = path[path_len-1].y + s_shift[i].y;

if ( path_len==1 )

{

if ( g_matrix.data[newPos.x][newPos.y]==0)

{

bFind=1; break; //找到一個位置

}

? ? ? ? ? ?}

? ? ? ? ? ?// path[path_len-1]表示當前位置,path[path_len-2]表示上一步的位置,

? ? ? ? ? ?// 如果新的位置等于上一個位置,將陷入循環,故要求新的位置不能是上一步的位置

? ? ? ? ? ?else if ( (newPos.x != path[path_len-2].x || newPos.y!=path[path_len-2].y) && g_matrix.data[newPos.x][newPos.y]==0)

? ? ? ? ? ?{

? ? ? ? ? ? ? ?bFind=1; break; ? ? ? ?//找到一個位置

? ? ? ? ? ?}

? ? ? ?}

if (bFind)

{

path[path_len++]=newPos; //將新的位置追加到path數組,路徑長度+1

if ( newPos.x==exit.x && newPos.y==exit.y)

return path_len;

}

else

{

matric[path[path_len-1].x][path[path_len-1].y]=1; //從當前位置,無路可走,將當前位置標記為墻

path_len--; ? ? ? ?//回退一步

if ( path_len==0)

return path_len;

}

}

}

int readMatrix(char *file)

{

? ?char line[1024];

? ?FILE *fp=NULL;

? ?int i,j,x,y;

? ?fp=fopen(file,"rt");

? ?if (fp==NULL)

? ?{

? ? ? ?printf("Can not open file %s\n",file);

? ? ? ?return 0;

? ?}

? ?memset(&(g_matrix),0,sizeof(g_matrix));

? ?fgets(line,sizeof(line)-1,fp);

sscanf(line,"%d %d",&x,&y); ? ? ? ? ? ? ? ? ? ?//讀入迷宮的行數和列數

if ( x>MAX_WIDTH || y>MAX_HEIGHT)

{

printf("The Matrix is too large\n");

fclose(fp);

return 0;

}

? ?g_matrix.width=x+2; ? ? ? ? ? ? ? ? ? ? ? ? ? ?//在4條邊增加4堵墻,故寬和高增加2

? ?g_matrix.height=y+2;

for (j=0;j

{

g_matrix.data[0][j]=1; ? ? ? ? ? ? ? ? ? ?//第一行為墻

g_matrix.data[g_matrix.height-1][j]=1; ? ?//最后一行為墻

}

? ?for (i=0;i

? ?{

? ? ? ?g_matrix.data[i][0]=1; ? ? ? ? ? ? ? ? ? ?//最左邊的列為墻

? ? ? ?g_matrix.data[i][g_matrix.width-1]=1; ? ?//最右邊的列為墻

? ?}

for (i=1;i

{

char *p;

fgets(line,sizeof(line)-1,fp);

j=1;

p=line;

while (1)

{

while ( *p==' ' ||*p== 9)//跳過空格符號

p++;

? ? ? ? ? ?if ( *p>='0' && *p<='9')

? ? ? ? ? ?{

? ? ? ? ? ? ? ?sscanf(p,"%d",&(g_matrix.data[i][j])); ?//讀入地i行j列的數據

? ? ? ? ? ? ? ?while ( *p>='0' && *p<='9')

? ? ? ? ? ? ? ? ? ?p++; ? ? ? ? ? ?//數據已經讀入,跳過當前的數字

? ? ? ? ? ? ? ?j++;

? ? ? ? ? ?}

? ? ? ? ? ?if (j>=g_matrix.width-2)

? ? ? ? ? ? ? ?break;

? ? ? ?}

? ?}

fgets(line,sizeof(line)-1,fp);

//讀入入口的行坐標和列坐標,和出口的行坐標,列坐標

sscanf(line,"%d %d %d %d",&(g_matrix.entrance.x),&(g_matrix.exit.y),&(g_matrix.exit.x),&(g_matrix.exit.y));

fclose(fp); fp=NULL;

g_matrix.entrance.x++; ?//增加了一列是墻,故入口橫坐標+1

g_matrix.entrance.y++; ?//增加了一行是墻,故入口縱坐標+1

g_matrix.exit.x++; ? ? ?//增加了一列是墻,故入口橫坐標+1

g_matrix.exit.y++; ? ? ? ?//增加了一列是墻,故入口縱坐標+1

? ?return 1;

}

int main()

{

? ?STEP path[MAX_WIDTH*MAX_HEIGHT];

? ?int step_count;

? ?if ( !readMatrix("matrix.txt") ) ?//不使用初始化的數據,從文件中讀入迷宮數據

? ?{

? ? ? ?return 0; ? ? ? ? ? ? ? ? ? ? ?//讀取失敗,直接跳出

}

? ?printf("The matrix is\n");

? ?print_Matrix(&g_matrix);

? ?path[0]=g_matrix.entrance; //將入口位置放入path數組

? ?step_count = search_path(g_matrix.data,path,1,g_matrix.exit); //查找一條路徑,路徑的每一步的坐標放入path數組

? ?if (step_count>0) ? ? ? ? ? ? ? ? ? ? ? ? ?//找到一條出路,步數>0

? ?{

? ? ? ?printf("\nThe path is\n");

? ? ? ?print_paths(path,step_count);

? ?}

? ?else ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //步數<=0, 沒有找到出路

printf("No solution\n");

return 0;

} ? ?

? ?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,484評論 2 379

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,764評論 0 33
  • 第1章 第一個C程序第2章 C語言基礎第3章 變量和數據類型第4章 順序結構程序設計第5章 條件結構程序設計第6章...
    小獅子365閱讀 10,712評論 3 71
  • 動態規劃(Dynamic Programming) 本文包括: 動態規劃定義 狀態轉移方程 動態規劃算法步驟 最長...
    廖少少閱讀 3,320評論 0 18
  • 現在的生活節奏快得像加速旋轉的風車,我們被推著著往前走。生活中的瑣事使我們無法清閑地享受,哪怕一分鐘的時間。有時候...
    一輝而明閱讀 276評論 0 0
  • 小Q彎著腰在收拾行李,準備我們明天去Z地需要的東西,突然,她抬起臉,用略帶感傷的聲音問我,“W先生,你喜歡這樣的生...
    W先生被占用了閱讀 219評論 0 2