上午
学习了动态链表的输入与输出,在链表题组中刷了那道合并链表的题但是出现了问题:输入完两条链表后仍然需要输入一个数字才能完成链接
下午
开始听课,知道了为什么bBFS(宽度)能找到类似于迷宫问题的最小解:
BFS是一层一层搜寻答案的,所以,当遇到了某一层没有分支后,便返回;由图可知,通过BFS搜寻的返回值必定是最小值。
晚上
刷题时间,讲课的时候听到了填涂颜色那道题不需要回溯(好像是),便思考那道题,具体的思路是:定义一个与地图相同的vis数组,从边边的一点开始遍历,只要不是0就将其标记为1;遇到1或边界就返回(要将边界染色不然会出现错误,类似于套娃求中间的那个娃),全部标记完后,开始输出,当vis数组有0时(剩下的这些0都是被1包围着的),输出2;其余按原地图输出。
#include<stdio.h>
int mp[50][50],vis[50][50];
int n;
int fx[4]= {0,0,-1,1};
int fy[4]= {1,-1,0,0};
void painting(int x,int y)
{
if(x<0||x>n+1||y<0||y>n+1||vis[x][y]!=0) //越界、未遍历过?????>n+1??????
{
return;
}
vis[x][y]=1; //涂鸦
for(int i=0; i<4; i++)
{
int l=x+fx[i];
int r=y+fy[i];
painting(l,r); //不需要回溯
}
}
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
scanf("%d",&mp[i][j]);
if(mp[i][j]==0)
{
vis[i][j]=0;
}
else
{
vis[i][j]=1; //copy地图
}
}
}
painting(0,0); //从左上角那个点开始查找
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(vis[i][j]==0)
{
printf("2 ");
}
else
{
printf("%d ",mp[i][j]);
}
}
printf("\n");
}
return 0;
}
结束了混水摸鱼的一天