最小生成树问题:njupt-1418:清扫

清扫

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 6            测试通过 : 5 

比赛描述

现在要打扫国王的牧圈。已经30年没打扫了。所以这次的计划是用河水来冲。
牧圈排成整齐的格子,每相邻的两个之间都有门。要想让水进去,就必须打开这些门。这不是件容易的事情。因为有些圈里土堆得很高。因此打开门就很费劲。为了使花的力气最小,总是把门推向土低的一边。你的任务是计算最少得费多少劲。我们用土的厚度来描述这个值。

 



输入

第一行是宽度w和高度h,其中3 <= w,h <= 40。以下h行数据,描述了土的高度,也就是我们所浪费体力的度量。数据的范围在1100之间。

输出

你得到的结果。所有的格子都必须进水。水是从左上角的格子进去的。

样例输入

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;
}


你可能感兴趣的:(最小生成树问题:njupt-1418:清扫)