從左上角「從」字出發,橫向/縱向移動到相鄰格子,路徑拼成「從我做起振興中華」(8字),求總路徑數、全路徑輸出、指定路徑輸出。
array[4][5] = {{0,1,2,3,4},{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}}int count = 0;
int flag[4][5] = {0}; // 路徑標記
int road_flag[7] = {0}; // 步向標記:1=右, 2=下
int step = 0;
void dfs(int r, int c) {
flag[r][c] = 1;
if (array[r][c] == 7) { // 到達終點
count++;
// 可選:輸出特定路徑模式
if (road_flag[0]==1 && road_flag[1]==2 && road_flag[2]==2 &&
road_flag[3]==2 && road_flag[4]==1 && road_flag[5]==1 && road_flag[6]==1) {
printPath(); // 輸出 # 表示路徑
}
return;
}
// 向右
if (c+1<5 && array[r][c+1]==array[r][c]+1) {
road_flag[step++] = 1;
dfs(r, c+1);
flag[r][c+1] = 0; step--; road_flag[step]=0; // 回溯恢復
}
// 向下
if (r+1<4 && array[r+1][c]==array[r][c]+1) {
road_flag[step++] = 2;
dfs(r+1, c);
flag[r+1][c] = 0; step--; road_flag[step]=0;
}
}
flag 防止重複訪問(本題單向遞增天然無環,但通用性需保留)road_flag 記錄每步方向,支持模式匹配# ^ ^ ^ ^ ^ # ^ ^ ^ ^ # ^ ^ ^ ^ # # # # ← 特定路徑可視化
