Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void dfs (int i, int j, int d) {
- for (int i1 = i - 1; i1 >= 0 && a[i1][j] && !used[i1 * m + j]; --i1) {
- dist[i1 * m + j] = min(dist[i1 * m + j], d + 1);
- used[i1 * m + j] = true;
- dfs(i1, j, d + 1);
- used[i1 * m + j] = false;
- }
- for (int i1 = i + 1; i1 < n && a[i1][j] && !used[i1 * m + j]; ++i1) {
- dist[i1 * m + j] = min(dist[i1 * m + j], d + 1);
- used[i1 * m + j] = true;
- dfs(i1, j, d + 1);
- used[i1 * m + j] = false;
- }
- for (int j1 = j + 1; j1 < m && a[i][j1] && !used[i * m + j1]; ++j1) {
- dist[i * m + j1] = min(dist[i * m + j1], d + 1);
- used[i * m + j1] = true;
- dfs(i, j1, d + 1);
- used[i * m + j1] = false;
- }
- for (int j1 = j - 1; j1 >= 0 && a[i][j1]; --j1) {
- dist[i * m + j1] = min(dist[i * m + j1], d + 1);
- used[i * m + j1] = true;
- dfs(i, j1, d + 1);
- used[i * m + j1] = false;
- }
- bool flag1 = true, flag2 = true, flag3 = true, flag4 = true;
- for (int k = 1; ; ++k) {
- int X = (i + k) * m + j + k;
- if (flag1 && i + k < n && j + k < m && a[i + k][j + k] && !used[X]) {
- dist[X] = min(dist[X], d + 1);
- used[X] = true;
- dfs(i + k, j + k, d + 1);
- used[X] = false;
- }
- else flag1 = false;
- X = (i + k) * m + j - k;
- if (flag2 && i + k < n && j - k >= 0 && a[i + k][j - k] && !used[X]) {
- dist[X] = min(dist[X], d + 1);
- used[X] = true;
- dfs(i + k, j - k, d + 1);
- used[X] = false;
- }
- else flag2 = false;
- X = (i - k) * m + j + k;
- if (flag3 && i - k >= 0 && j + k < m && a[i - k][j + k] && !used[X]) {
- dist[X] = min(dist[X], d + 1);
- used[X] = true;
- dfs(i - k, j + k, d + 1);
- used[X] = false;
- }
- else flag3 = false;
- X = (i - k) * m + j - k;
- if (flag4 && i - k >= 0 && j - k >= 0 && a[i - k][j - k] && !used[X]) {
- dist[X] = min(dist[X], d + 1);
- used[X] = true;
- dfs(i - k, j - k, d + 1);
- used[X] = false;
- }
- else flag4 = false;
- if (!flag1 && !flag2 && !flag3 && !flag4) break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement