從任意的W開始,不停地把鄰接的部分用'.'代替。1次DFS後與初始的這個W連接的所有W就都被替換成了'.',因此直到圖中不再存在W為止,總共進行DFS的次數就是答案了。8個方向共對應了8種狀態轉移,每個格子作為DFS的參數至多被調用一次,所以復雜度為O(8×N×M)=O(N×M)。
#include#include #include #include using namespace std; char map[110][110]; int dis[8][2]={{0,1},{1,0},{-1,0},{0,-1},{1,1},{-1,-1},{-1,1},{1,-1}}; int n,m; void dfs(int x,int y) { map[x][y]='.'; for(int i=0;i<8;i++) { int xx=x+dis[i][0]; int yy=y+dis[i][1]; if(xx<0||xx>=n||yy<0||yy>=m) continue; if(map[xx][yy]=='W') { dfs(xx,yy); } } return; } int main() { //freopen("d:\\test.txt","r",stdin); while(cin>>n>>m) { for(int i=0;i >map[i][j]; } } int ans=0; for(int i=0;i