清扫
时间限制(普通/Java) :
1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 6 测试通过 : 5
总提交 : 6 测试通过 : 5
比赛描述
现在要打扫国王的牧圈。已经30年没打扫了。所以这次的计划是用河水来冲。
牧圈排成整齐的格子,每相邻的两个之间都有门。要想让水进去,就必须打开这些门。这不是件容易的事情。因为有些圈里土堆得很高。因此打开门就很费劲。为了使花的力气最小,总是把门推向土低的一边。你的任务是计算最少得费多少劲。我们用土的厚度来描述这个值。
输入
第一行是宽度w和高度h,其中3 <= w,h <= 40。以下h行数据,描述了土的高度,也就是我们所浪费体力的度量。数据的范围在1到100之间。
输出
你得到的结果。所有的格子都必须进水。水是从左上角的格子进去的。
样例输入
4 3
3 5 2 1
7 3 4 8
1 6 5 7
样例输出
26
代码超时:
#include<stdio.h>
#include<stdlib.h>
int map[41][41];
int maxx,maxy;
int ans=0,ans0;
struct p
{
int x,y;
}pd[41*41];
int maxn=0;
int min(int a,int b)
{
if(a<b)return a;
return b;
}
int getscore(int x,int y,int a,int b)
{
int ans2=min(map[x][y],map[a][b]);
return ans2;
}
int ifin(int x,int y)
{
int i;
int ans = 0;
for(i=1;i<=maxn;i++)
{
if(pd[i].x==x&&pd[i].y==y)ans=1;
}
return ans;
}
int main()
{
int i,j,k;
int n;
int x,y;
int ansx,ansy;
scanf("%d %d",&maxx,&maxy);
for(j=1;j<=maxy;j++)
for(i=1;i<=maxx;i++)
{
scanf("%d",&map[i][j]);
}
n=maxx*maxy;
maxn=1;
pd[maxn].x=1;
pd[maxn].y=1;
while(maxn!=n)
{
ans0=9999999;
for(i=1;i<=maxn;i++)
{
x = pd[i].x;
y = pd[i].y;
if(x>1&&ifin(x-1,y)==0)
{
if(ans0>getscore(x,y,x-1,y))
{
ans0=getscore(x,y,x-1,y);
ansx = x-1;
ansy =y;
}
}
if(x<maxx&&ifin(x+1,y)==0)
{
if(ans0>getscore(x,y,x+1,y))
{
ans0=getscore(x,y,x+1,y);
ansx = x+1;
ansy =y;
}
}
if(y>1&&ifin(x,y-1)==0)
{
if(ans0>getscore(x,y,x,y-1))
{
ans0=getscore(x,y,x,y-1);
ansx = x;
ansy =y-1;
}
}
if(y<maxy&&ifin(x,y+1)==0)
{
if(ans0>getscore(x,y,x,y+1))
{
ans0=getscore(x,y,x,y+1);
ansx = x;
ansy =y+1;
}
}
}
maxn++;
pd[maxn].x=ansx;
pd[maxn].y=ansy;
ans = ans + ans0;
}
printf("%d\n",ans);
system("pause");
return 0;
}