其实昨天到今天就弄了两个题目,一个是填颜色,一个是拯救总部。
昨天我在写填颜色的时候用的好像不是bfs,我自己看不出来那个程序哪里运用了bfs。但是今天先将一些编译错误找出来了,保证至少有例子输入进去能够得到正确的结果。但是只有48分,目前不知道出错的原因,我下载了样例,打算早起研究。
然后是拯救总部这道题,运用的是dfs,这道题的思路还是能够明白的,没有第一天去了解bfs那么迷茫,代码也敲出来了。但是还没有调试,打算早起调试,并且总结一下,整理一下思路。
下面我将填颜色和拯救总部的代码分别贴出来,记录一下,方便以后纠错和复习吧。
填颜色:(这是第一次代码更改之后的情况,部分例子没法正常输出)
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);//图的大小
int map[33][33];
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
scanf("%d", &map[i][j]);
if (map[i][j] == 0)
{
map[i][j] = 2;//先假设将所有等于0的地方涂为2,之后再找出边界外的2改为0
}
}
}
for (int i = 1; i <= n; i++)//将所有边界的2都可以置为0
{
if(map[1][i]==2) map[1][i] = 0;
if(map[n][i]==2) map[n][i] = 0;
if(map[i][1]==2) map[i][1] = 0;
if(map[i][n]==2) map[1][n] = 0;
}
for (int i = 0; i <= n; i++)//将图扩大一圈
{
map[0][i] = 9;
map[i][0] = 9;
map[n+1][i] = 9;
map[i][n+1] = 9;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (map[i][j] != 1)
{
if (map[i - 1][j] == 0 || map[i + 1][j] == 0 || map[i][j + 1] == 0 || map[i][j - 1] == 0)
{
map[i][j] = 0;
}
}
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
printf("%d ", map[i][j]);
}
printf("\n");
}
return 0;
}
拯救总部:(题目不贴了,因为只是一个记录贴,之后总结的时候再写详细内容吧)
#include<stdio.h>
int up[5] = { 0,1,-1,0,0 };//方向数组
int down[5] = { 0,0,0,1,-1 };
int x = 0;
int y = 0;
void search(int arr[][]; int m; int n)
{
int xx = 0;
int yy = 0;
arr[m][n] = 1;//该位置在之前已判断为淹没点,所以设置为1,标记
for (int i = 1; i <= 4; i++)//得到其上下左右位置的坐标
{
xx = m + up[i];
yy = n + down[i];
if (xx>0&&xx<=x&&yy>0&&yy<=y&&arr[xx][yy] == 0)
search(arr, xx, yy);
}
}
int main()
{
char k;
int s = 0;
int arr[502][502];
scanf("%d", &x);
scanf("%d", &y);
for (int i = 1; i <= x; i++)//处理图
{
for (int j = 1; j <= y; j++)
{
scanf("%c", &k);
if (k == '*')
arr[i][j] = 1;
else
arr[i][j] = 0;
}
}
for (int i = 1; i <= y; i++)//查第一行和最后一行
{
if (arr[1][i] == 0)//第一行
search(arr,1,i);
if (arr[x][i] == 0)//最后一行
search(arr,x,i);
}
for (int i = 1; i <= x; i++)//查第一列和最后一列
{
if (arr[i][1] == 0)
search(arr, i, 1);
if (arr[i][y] == 0)
search(arr, i, y);
}
for (int i = 1; i <= x; i++)
{
for (int j = 1; j <= y; j++)
{
if (arr[i][j] == 0)
s++;
}
}
printf("%d", s);
return 0;
}