深度优先搜索(DFS):POJ1979--Red and Black

    xiaoxiao2025-03-04  7

    本题是很简单的深搜题。从起点出发每个黑色顶点访问一次即可,访问过的标为已访问(或直接标红色)。看到有些人使用了记忆化搜索,是小题大做了,因为本题的顶点访问一次后就“失效”了,所以没有记忆的必要。原题链接

    #include <iostream> #include <cstring> #define MAX_W 21 #define MAX_H 21 #define INF 10000 using namespace std; int data[MAX_W][MAX_H]; ///不存在为INF,不可走为0,走过为-1,可走为1(前三个可只用0表示) int xi[]={1,0,-1,0}; ///定义方向 int yi[]={0,1,0,-1}; int w,h; int solve(int x,int y){ if(data[x][y]!=1) return 0; data[x][y]=-1; int sum=0; for(int i=0;i<4;i++) if(x+xi[i]>=0&&x+xi[i]<=h&&y+yi[i]>=0&&y+yi[i]<=w) sum+=solve(x+xi[i],y+yi[i]); return 1+sum; } int main() { int xx,yy; char tmp; while(cin>>w>>h){ if(!w||!h) break; memset(data,INF,sizeof(data)); ///矩阵快速赋值 for(int i=0;i<h;i++) for(int j=0;j<w;j++){ cin>>tmp; if(tmp=='.') data[i][j]=1; else if(tmp=='#') data[i][j]=0; else { xx=i,yy=j; data[i][j]=1; } } cout<<solve(xx,yy)<<endl; } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-1296871.html
    最新回复(0)