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; }
待到oi十一月,我花开后百花杀。