題目大意
題目分析
首先,嘗試求解沒有給定線段情況下,所有合法的路徑的總數。可以使用dfs進行搜尋。**如下:
void dfs(int row, int col, int cur_len)if (cur_len == 10)
return;
for (int i = 0; i < 3; i++)
}int cur = 3 * row + col;
int next = 3 * next_row + next_col;
dfs(next_row, next_col, cur_len + 1, need_use, cur_used + 1);
}} }
visited[row][col] = false;
}
在上面的dfs搜尋基礎上,新增對已有線段的限制。9個點,維護 connected[9][9], connected[i][j] 表示已經有線段將i和j連線。搜尋的時候,還需要維護狀態,cur_used表示當前已經經過了已有線段的數目,如果已經經過了所有的線段。且當前路徑經過點數大於等於4,則是乙個合法的解鎖路徑。
實現
#include#include#includeusing namespace std;bool visited[3][3];
bool connected[9][9];
int total_count;
//cur_len 為到達row,col點時候,路徑的長度; cur_used表示已經走過的路徑所覆蓋的已有線段的個數
void dfs(int row, int col, int cur_len, int need_use, int cur_used)
if (cur_len == 10)
return;
for (int i = 0; i < 3; i++)
}int cur = 3 * row + col;
int next = 3 * next_row + next_col;
if(connected[cur][next])
dfs(next_row, next_col, cur_len + 1, need_use, cur_used + 1);
else
dfs(next_row, next_col, cur_len + 1, need_use, cur_used);
}} }
visited[row][col] = false;
}void getcount(int need_use) }}
int main()
getcount(need_use);
printf("%d\n", total_count);
} return 0;
}
hihoCoder 1054 滑動解鎖
時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 滑動解鎖是智慧型手機一項常用的功能。你需要在3x3的點陣上,從任意乙個點開始,反覆移動到乙個尚未經過的 相鄰 的點。這些劃過的點所組成的有向折線,如果與預設的折線在圖案 方向上都一致,那麼手機將解鎖。兩個點相鄰當且僅當以這兩個點...
滑動解鎖 HihoCoder 1054
滑動解鎖是智慧型手機一項常用的功能。你需要在3x3的點陣上,從任意乙個點開始,反覆移動到乙個尚未經過的 相鄰 的點。這些劃過的點所組成的有向折線,如果與預設的折線在圖案 方向上都一致,那麼手機將解鎖。兩個點相鄰當且僅當以這兩個點為端點的線段上不存在尚未經過的點。此外,這條折線還需要至少經過4個點。為...
HihoCoder 1054 滑動解鎖 dfs
時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 滑動解鎖是智慧型手機一項常用的功能。你需要在3x3的點陣上,從任意乙個點開始,反覆移動到乙個尚未經過的 相鄰 的點。這些劃過的點所組成的有向折線,如果與預設的折線在圖案 方向上都一致,那麼手機將解鎖。兩個點相鄰當且僅當以這兩個點...