首先看一下题目大意:有一个m*n的地图,上面的瓷砖只有红黑两色。一个人站在某处。一直这个人只能在黑色方块上向四周移动,问他最多可以经过多少个黑色方块。
n,m<=20...
十分明显的一道搜索题,dfs或者bfs都可以实现。
我用的是dfs
dfs的关键在于向四个方向遍历这张图
如果目标位置在边界内,并且为黑色方块,则证明可以移动到此处,那就从目标位置继续遍历。
为了防止重复遍历,我们把走过的每一个瓷砖也定为红色(不可以再走)
就像这样
void dfs(int x,int y) { sum++; a[x][y]='#'; for(int i=0;i<4;i++) { int xx=x+dx[i],yy=y+dy[i]; if(x<n&&x>=0&&y<m&&y>=0&&a[xx][yy]=='.') dfs(xx,yy); } return; }
主要操作部分有了,接下来就是读入这张图,记录下初始位置
注意!!这里有一个很坑的点,在输入的时候需要先输入列数,再输入行数
我被它坑了好久
主函数:
int main() { while(scanf("%d%d",&m,&n)) { sum=0; memset(a,0,sizeof(a)); if(m==0&&n==0) break; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cin>>a[i][j]; if(a[i][j]=='@') { x=i; y=j; } } } dfs(x,y); cout<<sum<<endl; } return 0; }
完整代码
#include<bits/stdc++.h> using namespace std; char a[25][25]; int n,m,x,y; int dx[4]={0,0,-1,1}; int dy[4]={1,-1,0,0}; int sum,ans; void dfs(int x,int y) { sum++; a[x][y]='#'; for(int i=0;i<4;i++) { int xx=x+dx[i],yy=y+dy[i]; if(x<n&&x>=0&&y<m&&y>=0&&a[xx][yy]=='.') dfs(xx,yy); } return; } int main() { while(scanf("%d%d",&m,&n)) { sum=0; memset(a,0,sizeof(a)); if(m==0&&n==0) break; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cin>>a[i][j]; if(a[i][j]=='@') { x=i; y=j; } } } dfs(x,y); cout<<sum<<endl; } return 0; }
水题~