#include <stdio.h>
#include <stdlib.h>
#define DEBUG
#ifndef DEBUG
#define N_MAX (500+1)
#define M_MAX (500+1)
#else
#define N_MAX (10+1)
#define M_MAX (10+1)
#endif
int g_IsAllSucceed = 0 ,g_iBuildCnt = 0,g_iCanNotBuild = 0;
int g_iHeight = 0,g_iWidth = 0;
int g_City[N_MAX][M_MAX],g_FlagOK[N_MAX][M_MAX] = {0};
void ReadFile()
{
int i = 0,j = 0;
FILE *fp = fopen("flow.in","rb");
if (fp == NULL)
{
return;
}
fscanf(fp,"%d%d",&g_iHeight,&g_iWidth);
for (i = 1; i<=g_iHeight ; i++)
{
for (j = 1; j<=g_iWidth ; j++)
{
fscanf(fp,"%d",&g_City[i][j]);
}
}
fclose(fp);
}
void WriteFile()
{
int i = 0;
FILE *fp = fopen("flow.out","wb");
if (fp == NULL)
{
return;
}
if (g_IsAllSucceed != 0)
{
fprintf(fp,"%d\r\n%d\r\n",g_IsAllSucceed,g_iBuildCnt);
}
else
{
fprintf(fp,"%d\r\n%d\r\n",g_IsAllSucceed,g_iCanNotBuild);
}
fclose(fp);
}
void BuildAnother(int N,int M)
{
int i = N,j = M;
g_FlagOK[i][j] = 1;
if ((g_City[i][j] > g_City[i][j-1]) && (j-1 >= 1))
{
BuildAnother(i,j-1);//左边一个
}
if ((g_City[i][j] > g_City[i][j+1]) && (j+1 <= g_iWidth))
{
BuildAnother(i,j+1);//右边一个
}
if ((g_City[i][j] > g_City[i-1][j]) && (i-1 >= 1))
{
BuildAnother(i-1,j);//上边一个
}
if ((g_City[i][j] > g_City[i+1][j]) && (i+1 <= g_iHeight))
{
BuildAnother(i+1,j);//下边一个
}
}
void BuildOne(int N,int M)
{
g_iBuildCnt++;
int i = N,j = M;
g_FlagOK[i][j] = 1;
if ((g_City[i][j] > g_City[i][j-1]) && (j-1 >0))
{
BuildAnother(i,j-1);//左边一个
}
if ((g_City[i][j] > g_City[i][j+1]) && (j+1 <= g_iWidth))
{
BuildAnother(i,j+1);//右边一个
}
if ((g_City[i][j] > g_City[i+1][j]) && (i+1 <= g_iHeight))
{
BuildAnother(i+1,j);//下边一个
}
}
void CheckCanNotBuild()
{
for (int i = 1; i <= g_iHeight ; i++)
{
for (int j = 1;j <= g_iWidth;j++)
{
if (g_FlagOK[i][j] == 0)
{
g_iCanNotBuild ++;
}
}
}
}
int IsFinished()
{
int iRet = 1;
for (int i = 1; i <= g_iHeight ; i++)
{
for (int j = 1;j <= g_iWidth;j++)
{
if (g_FlagOK[i][j] == 0)
{
iRet = 0;
i = g_iHeight+1;//break All
break;
}
}
}
return iRet;
}
int Flow()
{
int iMaxHeight = 0;
int iMaxj = 0;
int iIsNoneToBuild = 1;
do
{
iIsNoneToBuild = 1;
iMaxHeight = 0;
for (int j = 1; j <= g_iWidth;j++ )
{
if ((g_City[1][j] >iMaxHeight) && (g_FlagOK[1][j] == 0))
{
iMaxHeight = g_City[1][j];
iMaxj = j;
iIsNoneToBuild = 0;
}
}
BuildOne(1,iMaxj);
} while ((IsFinished() == 0) && (iIsNoneToBuild != 1));
if (IsFinished() == 1)
{
return 1;
}
return 0;
}
int main(int argc, char* argv[])
{
ReadFile();
g_IsAllSucceed = Flow();
if (g_IsAllSucceed == 0)
{
CheckCanNotBuild();
}
WriteFile();
return 0;
}
本文介绍了一个基于文件输入的城市建筑模拟算法。该算法读取城市高度图,并尝试在满足一定条件的情况下尽可能多地建造建筑物。通过递归地检查四周的建筑高度,确保新建建筑的高度大于周围的建筑。最终,算法会输出是否成功建造所有可以建造的建筑以及未能建造的地点数量。
复赛 提高组 试题四 解题代码&spm=1001.2101.3001.5002&articleId=6628426&d=1&t=3&u=731aa7f307434052ab0e7e2eec80a623)
376

被折叠的 条评论
为什么被折叠?



