【ACM】CODE[VS] 2806(DFS)
阿新 • • 發佈:2018-11-19
感覺有點入了DFS的門檻,距離完全掌握還差得遠呢
AC程式碼:執行時間為7ms
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 26; int vis[maxn][maxn],col,line,flag,count; char map[maxn][maxn]; int xx[5]={0,-1,1,0,0}; int yy[5]={0,0,0,-1,1}; void dfs(int x,int y) { int i; vis[x][y]=1; for(i=1;i<=4;i++) { if(x+xx[i]>=0 && y+yy[i]>=0 && x+xx[i]<line && y+yy[i]<col && map[x+xx[i]][y+yy[i]]!='#' && !vis[x+xx[i]][y+yy[i]]) { count++; dfs(x+xx[i],y+yy[i]); } } return; } int main () { int T,i,j,m,n; while(scanf("%d%d",&col,&line)==2 && col && line) { getchar(); count=1; //先輸入列,在輸入行 memset(vis,0,sizeof(vis)); memset(map,0,sizeof(map)); for(i=0;i<line;i++) { for(j=0;j<col;j++) { cin>>map[i][j]; if(map[i][j]=='@') { m=i;n=j; } } } dfs(m,n); printf("%d\n",count); } return 0; }
修改後:執行時間4ms
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 26; int vis[maxn][maxn],col,line,flag,count; char map[maxn][maxn]; int xx[5]={0,-1,1,0,0}; int yy[5]={0,0,0,-1,1}; void dfs(int x,int y) { //先判斷,在標記 if(x<0 || x>=line || y<0 || y>=col || map[x][y]=='#' || vis[x][y]==1) return ; int i; if(map[x][y]=='.') { vis[x][y]=1; count++; } for(i=1;i<=4;i++) { dfs(x+xx[i],y+yy[i]); } return; } int main () { int T,i,j,m,n; while(scanf("%d%d",&col,&line)==2 && col && line) { getchar(); count=1; //先輸入列,在輸入行 memset(vis,0,sizeof(vis)); memset(map,0,sizeof(map)); for(i=0;i<line;i++) { for(j=0;j<col;j++) { cin>>map[i][j]; if(map[i][j]=='@') { m=i;n=j; } } } dfs(m,n); printf("%d\n",count); } return 0; }