在設計賺錢的網(wǎng)站有哪些做網(wǎng)站需要多少錢
今天在題單中看了搜索。
解析:兩個一維數(shù)組,用于表示上下左右四個方向的偏移量,分別對應?x
?軸和?y
?軸的偏移,遍歷四個方向(左、右、下、上),對于每個方向,檢查目標位置是否未走過(temp[x + dx[i]][y + dy[i]] == 0)且不是障礙(map[x + dx[i]][y + dy[i]] == 1)。如果滿足條件,將當前位置標記為已走過(temp[x][y] = 1),然后遞歸調(diào)用 walk 函數(shù)繼續(xù)搜索。遞歸返回后,將當前位置標記為未走過(temp[x][y] = 0),以便嘗試其他可能的路徑。首先讀取地圖的長 n、寬 m 和障礙總數(shù) T。
將地圖的所有位置初始化為可通行(map[ix][iy] = 1)。讀取起點坐標 (sx, sy) 和終點坐標 (fx, fy)。
循環(huán) T 次,每次讀取一個障礙的坐標 (l, r),并將該位置標記為障礙(map[l][r] = 0)。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int map[6][6];
int temp[6][6];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {-1, 1, 0, 0};
int total, fx, fy, sx, sy, T, n, m, l, r;
void walk(int x, int y) {if (x == fx && y == fy) {total++;return;} else {for (int i = 0; i <= 3; i++) {if (temp[x + dx[i]][y + dy[i]] == 0 && map[x + dx[i]][y + dy[i]] == 1) {temp[x][y] = 1;walk(x + dx[i], y + dy[i]);temp[x][y] = 0;}}}
}
int main() {scanf("%d %d %d", &n, &m, &T);for (int ix = 1; ix <= n; ix++) {for (int iy = 1; iy <= m; iy++) {map[ix][iy] = 1;}}scanf("%d %d", &sx, &sy);scanf("%d %d", &fx, &fy);for (int u = 1; u <= T; u++) {scanf("%d %d", &l, &r);map[l][r] = 0;}walk(sx, sy);printf("%d", total);return 0;
}
解析:將當前位置 (o, p) 標記為 1,表示該位置已經(jīng)被訪問過。循環(huán)遍歷四個方向(右、下、左、上),遞歸調(diào)用 dfs 函數(shù)繼續(xù)搜索相鄰位置。從矩陣的四條邊界(上、下、左、右)開始調(diào)用 dfs 函數(shù)進行搜索。因為邊界上的 0 肯定不會被 1 完全包圍,通過 DFS 可以將與邊界上的 0 相連通的所有 0 標記為 1。遍歷 a 數(shù)組,如果某個位置的值仍然為 0,說明該位置的 0 被 1 完全包圍,將 b 數(shù)組中對應位置的值改為 2。
#include<stdio.h>
int a[30][30],b[30][30];
int dx[5]={0,0,1,0,-1};
int dy[5]={0,1,0,-1,0};
int n;
void dfs(int o,int p)
{int i;if(o<0||o>n+1||p<0||p>n+1||a[o][p]!=0){return;}a[o][p]=1;for(i=1;i<=4;i++){dfs(o+dx[i],p+dy[i]);}
}int main()
{int i,j;scanf("%d",&n);for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%d",&a[i][j]);b[i][j]=a[i][j];}}for(i=0;i<n;i++)dfs(0,i);for(i=0;i<n;i++)dfs(n-1,i);for(i=0;i<n;i++)dfs(i,0);for(i=0;i<n;i++)dfs(i,n-1);for(i=0;i<n;i++){for(j=0;j<n;j++){if(a[i][j]==0)b[i][j]=2;}}for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%d ",b[i][j]);printf("\n");}return 0;
}