P1162填涂颜色

这还是一个搜索题,难度较低,但我提交第三次才AC..

观察0地图左上角的上面和左面都是一,所以先把他找粗来,然后设成start,然后dfs找到与他联通的块,涂成2即可。再说一下自己犯的低级错误:1.当找到坐上角时,必须先break掉里面的for,然后bool变量必须放在第一个for的里面,但我放在了上面,,,2.找到开始坐标后先打上标记。3.忘记加dfs(tx,ty)了

1.预处理正确性需要保证,低级错误要手动避免

2.再去练习难度较大的搜索题目

3.寻找好条件的客观规律,然后去解决

4.提交的时候别自信满满,静下心来想一想,noip上是黑盒!

代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
int mp[40][40],book[40][40];
int dx[4]={0,-1,0,1};
int dy[4]={1,0,-1,0};
int startx,starty;
bool flag=true;
void dfs(int x,int y){
    for(int k=0;k<=3;k++){
        int tx=dx[k]+x;
        int ty=dy[k]+y;
        if(mp[tx][ty]==0&&tx>=1&&ty>=1&&tx<=n&&ty<=n&&book[tx][ty]==0){
            book[tx][ty]=1;
            mp[tx][ty]=2;
            dfs(tx,ty);
        }
        else continue;
    }
    return;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            scanf("%d",&mp[i][j]);
            book[i][j]=0;
        }
    }
    mp[1][0]=6;
    mp[0][1]=6;    
    for(int i=1;i<=n;i++){
        if(flag==true){
            for(int j=1;j<=n;j++){
                if(mp[i][j]==0){
                    if(mp[i-1][j]==1&&mp[i][j-1]==1){
                    startx=i;
                    starty=j;
                    flag=false;
                    break;
                    }
                }
            }
        }    
    }
    //cout<<endl;
    //cout<<startx<<starty;
    dfs(startx,starty);
    mp[startx][starty]=2;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cout<<mp[i][j]<<" ";
        }
    cout<<endl;
    }        
    return 0;
}

 

posted @ 2019-08-02 20:30  毛炯人  阅读(174)  评论(0编辑  收藏  举报