题意:。表示能走,#表示不能走,@为起点,求从起点出发能走的点的数目
分析:简单的BFS或DFS
BFS代码:
#include<iostream> #include<cstring> #include<queue> using namespace std; int n,m; char a[100][100]; int d[4][2]={{0,-1},{0,1},{1,0},{-1,0}}; int cnt; int sx,sy; struct h{ int x,y; }; queue<h> q; void bfs() { h tmp; while(!q.empty()){ tmp=q.front(); q.pop(); for(int i=0;i<4;i++){ h tmp2; tmp2.x=tmp.x+d[i][0]; tmp2.y=tmp.y+d[i][1]; if(tmp2.x>=0&&tmp2.x<m&&tmp2.y>=0&&tmp2.y<n&&a[tmp2.x][tmp2.y]!='#'){ cnt++; a[tmp2.x][tmp2.y]='#'; q.push(tmp2); } } } } int main() { while(cin>>n>>m){ if(!n&&!m) break; while(!q.empty()) q.pop(); for(int i=0;i<m;i++) for(int j=0;j<n;j++){ cin>>a[i][j]; if(a[i][j]=='@') sx=i,sy=j; } a[sx][sy]='#'; h tmp; tmp.x=sx,tmp.y=sy; cnt=1; q.push(tmp); bfs(); cout<<cnt<<endl; } }
DFS代码:
#include<iostream> #include<cstring> using namespace std; int n,m; char a[100][100]; int d[4][2]={{0,-1},{0,1},{1,0},{-1,0}}; int cnt; int sx,sy; void dfs(int x,int y) { if(a[x][y]=='#') return; a[x][y]='#'; cnt++; for(int i=0;i<4;i++){ int dx=x+d[i][0]; int dy=y+d[i][1]; if(dx>=0&&dx<m&&dy>=0&&dy<n){ dfs(dx,dy); } } } int main() { while(cin>>n>>m){ if(!n&&!m) break; for(int i=0;i<m;i++) for(int j=0;j<n;j++){ cin>>a[i][j]; if(a[i][j]=='@') sx=i,sy=j; } cnt=0; dfs(sx,sy); cout<<cnt<<endl; } }
时间: 2024-11-10 13:55:37