hdu1312 Red and Black

题目

首先看一下题目大意:有一个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;
} 

水题~

上一篇:2020-01-29


下一篇:【SSL 2324 / 洛谷P1451】细胞问题【DFS】