俄罗斯套娃问题的C语言解

June 6th, 2010 will 1 comment

貌似是中兴出的题目,原题如下:

伊万洛夫在比武大会上力克群雄,成为新一届“草原雄鹰”,为部落赢得了莫大荣誉。首领决定要重重奖赏,他对伊万洛夫说:“孩子,你是知道的,面前的这片草原,南北向和东西向的道路纵横交错。现在,路口放着纯金打造的俄罗斯娃娃,重量大小不等,重的都能装下轻的。你可以沿着道路飞奔,拾取路口的娃娃,要求是任何时刻必须是一个套娃,装好后就不能再拆开了。注意不要走重复路。”
请你为伊万洛夫规划路线,使得他能够有最大的收获。
Input:  cross.txt
输入包括多组测试用例;
每个测试用例开始是一对整数<R, C>,R表示东西向道路数,C表示南北向道路总数;接下来R行,每行包括C个正整数W[r,c] ,分别表示第r条东西向道路与第c条南北向道路交叉处路口放置的俄罗斯娃娃的重量。
Output:
输出能有最大收获的路径规划。
假设1:
   cross.txt
   2     7
   1     2   13   6   7  12  11
   14   3   4     5   8   9   10
输出:
1 2 3 4 5 6 7 8 9 10 11 12
假设2:
   cross.txt
   5    5

1   16   15   14   13

2   17   24   23   12
3   18   25   22   11
4   19   20   21   10
5    6     7     8     9
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
注释:
1)从<0,0>出发;
2)路线不能重复;
3)不要求最后回到出发点。

貌似很多人都想到了递归方法的实现,由于对于递归使用很少,没有把握,就使用以前维特比译码相类似的方法。直接放代码,代码质量较差,见谅。

/*
http://xinzero.com
will@xinzero.com
*/
#include <stdio.h>
#include <stdlib.h>

struct stat{
	int met;	//profit
	int value;
	int x;
	int y;
	stat *plast;
};

void main()
{
	int *pint=NULL,*pInit=NULL;
	stat *pPath=NULL,*pSta=NULL,*pMax=NULL;
	int row=0,col=0;
	int i=0,j=0,k=0;
	int m=0,n=0,l=0;
	int imax=0;
	int M=0,R=0;
	printf("input R,C value:");
	scanf_s("%d %d",&row,&col);
	printf("[R,C]=[%d,%d]\r\n",row,col);
	pInit = (int*)malloc(sizeof(int)*row*col);
	pint = pInit;
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)
		{
			scanf_s("%d",pint++);
		}
	}

	pint = pInit;
	printf("The path\r\n");
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)
		{
			printf("%d ",*pint++);
		}
		printf("\r\n");
	}

	pint = pInit;
	pPath = (stat*)malloc(sizeof(stat)*row*row*col*col);
	pSta = pPath;
	for(i=0;i<row*col*row*col;i++)
	{
		pSta->met =-1;
		pSta->value = 0;
		pSta->plast =NULL;
		pSta++;
	}
	pSta = pPath;
	pSta->met = *pint;
	pSta->value = *pint;
	pSta->x=0;
	pSta->y=0;
	i=j=0;
	for(k=1;k<row*col;k++)
	{
		M = 0;
		for(l=0;l<row*col;l++)
		{
			m = l*row*col+k;	//current valid
			if(pSta[m-1].met==-1)
			{
				continue;
			}
			else
			{
				i = pSta[m-1].x;
				j = pSta[m-1].y;
				printf("i=%d,j=%d",i,j);
				if((i+1)<row)
				{
					n = (i+1)*col + j;
					if(pint[n]>pSta[m-1].value)
					{
						R = M*row*col + k;
						pSta[R].met = pSta[m-1].met + pint[n];
						pSta[R].value = pint[n];
						pSta[R].x = i+1;
						pSta[R].y = j;
						pSta[R].plast = &pSta[m-1];
						printf("[%d,%d],%d,met:%d",i+1,j,R,pSta[R].met);
						M++;
					}
				}
				if((i-1)>=0)
				{
					n = (i-1)*col + j;
					if(pint[n]>pSta[m-1].value)
					{
						R = M*row*col + k;
						pSta[R].met = pSta[m-1].met + pint[n];
						pSta[R].value = pint[n];
						pSta[R].x = i-1;
						pSta[R].y = j;
						pSta[R].plast = &pSta[m-1];
						printf("[%d,%d],%d,met:%d",i-1,j,R,pSta[R].met);
						M++;
					}
				}
				if((j+1)<col)
				{
					n = i*col + j+1;
					if(pint[n]>pSta[m-1].value)
					{
						R = M*row*col + k;
						pSta[R].met = pSta[m-1].met + pint[n];
						pSta[R].value = pint[n];
						pSta[R].x = i;
						pSta[R].y = j+1;
						pSta[R].plast = &pSta[m-1];
						printf("[%d,%d],%d,met:%d",i,j+1,pSta[R],pSta[R].met);
						M++;
					}
				}
				if((j-1)>=0)
				{
					n = i*col + j-1;
					if(pint[n]>pSta[m-1].value)
					{
						R = M*row*col + k;
						pSta[R].met = pSta[m-1].met + pint[n];
						pSta[R].value = pint[n];
						pSta[R].x = i;
						pSta[R].y = j-1;
						pSta[R].plast = &pSta[m-1];
						printf("[%d,%d],%d,met:%d",i,j-1,pSta[R],pSta[R].met);
						M++;
					}
				}
				printf("\r\n");
			}
		}
		printf("\r\n");
	}

	for(k=row*col-1;k>=0;k--)
	{
		for(l=0;l<row*col;l++)
		{
			m = l*row*col+k;
			//printf("%d,%d,",m,pSta[m].met);
			if(pSta[m].met==-1)
			{
				continue;
			}
			else
			{
				if(imax<pSta[m].met)
				{
					imax = pSta[m].met;
					pMax = &pSta[m];
					printf("imax:%d\n",imax);
				}

			}
		}
	}
	pint = pInit;
	i=0;
	//do
	while(pMax->plast!=NULL)
	{
		*pint = pMax->value;
		pMax = pMax->plast;
		printf("%d,%d ",i,*pint);
		pint++;
		i++;
	}//while(pMax->plast!=NULL);

	*pint = pMax->value;
	pMax = pMax->plast;
	printf("%d,%d ",i,*pint);
	pint++;
	i++;
	printf("\r\n");
	pint = pInit;
	while(i>0)
	{
		printf("%d ",pint[i-1]);
		i--;
	}
	printf("\r\n");
	//system("pause");
	free(pInit);
	free(pPath);
}
Categories: 学习笔记 Tags:

学习作业与工作任务

May 23rd, 2010 will No comments

在读书的时候,老师经常说不能把作业当任务来完成。其实我开始也不是一个喜欢写作业的人,在小学的时候,放学之后就是玩,偶尔到了晚上才想起写作业,很少能写完,不是因为作业多,而是玩的太累想睡觉。后来不知道是受了父亲的教育,还是因为留级后居然被任命为班干部。我放学后就开始做作业,然后再去玩,其实作业也不是很多,做完后还是有时间去玩的。到初中后每个周末双休,老师会留很多作业,由于多年先写作业的习惯,我会在周五晚就把作业搞定,然后就是双休了。后来就有同学拿我的作业抄,但由于我赶在周五晚上搞定作业,难免会出现错误,当然这些个错误,都是很多同学都会犯的,那时基本我做错的题,老师都会在班上讲,因为错的人多,当然不是因为别人抄我作业的人多。当然我做错了题,还给别人抄,感觉很丢脸,所以以后做完作业后了,我还会再检查,对自己做错的题,会认真的思考,找出错误的原因,学习成绩也有了一些进步。有一次有道数学题我使用了一种解题方法,在全班只有我一个人用,但是却有很多copy,那些同学倒霉了,被老师批评了。以后也就很少有同学抄我的作业了,因为风险太高了。我仍然是独立地完成作业。

到了大学,我也是独立完成作业,从不抄袭,我认为我没有必要抄袭,且对于抄袭很不屑。由于大学里我自己的懒散,我经常是不交作业,但也会在后面慢慢地将作业做完。因为我还是要学一些东西,而且要保证顺利毕业。在大学里我什么成就感都没有,平平淡淡地混完了四年。

现在工作了,我比在学校不知道积极了多少,然而还是不能按时按量的完成工作任务。现在任务是公司给的,更确切的说是自己给自己的,一个大的任务下来,什么东西都没有细化,也没什么方案,一切都是自己做。第一个任务在我连续四个月的加班中,勉强算是做完了,但是似乎交货之后,客户就没怎么用。第一个任务刚完就有开始了另一个项目,也是加班三个月,时间很紧,也算是按时交货了。后来的项目都重叠了,几个项目同时进行,我现在每天只能应付最紧急的任务,其它的任务都很难保证了,慢慢犯的错误也越来越多了,慢慢的我也对我的任务失去了兴趣了,工作的积极性下降,任务完不成,着急又出错,进入恶性循环。

对比读书时期的做作业,难道说我就是只能在学校学习,应付考试,我不相信。我该如何从恶性循环中跳出来,从工作中找到乐趣?

Categories: 工作记录 Tags:

win7下使用VS2005

May 22nd, 2010 will No comments

前段时间将本本的系统升级到Win7,升级之后第一个做的居然是玩游戏,发现了Win7下《魔兽争霸》《极品飞车》等游戏不能全屏,修改注册表解决Win7游戏全屏。今天需要编译一个程序,需要安装VS2005。和往常一样先安装虚拟光驱daemon tools,但是由于daemon tools的版本太早不支持Win7,导致重启之后进入不了系统,没办法选择了Win7系统自带的系统还原,还原到一个较早的还原点。下载新版的daemon tools可以支持Win7,顺利安装完了VS2005,但在开始菜单中都找不到VS2005的启动程序,在运行中运行“devenv”也不能启动,看到是VS2005与Win7存在兼容性问题,google之,需要安装VS2005补丁VS80sp1-KB926604-X86-CHS.exe,以前支持Vista的补丁,对于Win7同样有效。

PS:安装速度巨慢,慢慢等等吧。有兴趣的同学可以看看这里

Categories: 软件应用 Tags: ,

关于QQmail不能发送到Gmail的问题所在

May 7th, 2010 will No comments

五一假之后,我看到了genie给我的留言,然而我使用QQmail发送到Gmail还是失败,我想如果是普遍问题,那么应该很快就会解决,我开始怀疑我遇到这个问题,只是我个人的RP问题。随即更换浏览器测试,采用Win7系统自带的IE8.0测试,发送邮件没有问题。看来问题出在遨游(maxthon)浏览器上。我上网工具使用的Win7+Maxthon2.5.11 3390。

搜索了一下,Maxthon2.5.11.3390是一修正版,修正了一些Win7下的问题,不知道我遇到的这个问题,还有同学遇到吗?将Maxthon升级到最新的2.5.12 4586仍然发送失败。先将问题提交到Maxthon,等解决了,再更新吧。

今天又正常了,难道真是RP问题~~~~~。向QQ邮箱与Maxthon道歉,还是领导对我说的,先查自己的问题,再怀疑他人。

Categories: 网络观察 Tags:

非诚勿扰背景音乐

May 5th, 2010 will No comments

最近江苏卫视的《非诚勿扰》热播,据说是全国同类节目中收视率最高的。当我守在电视机前看的那周,由于悼念青海玉树地震停播了,没看到。其实网上很多,但网速慢太卡,影响观看质量。五一期间是看到了。感觉确实不错,其背景音乐也给我很深的印象。

《非诚勿扰》女嘉宾出场音乐插曲 艾薇儿(Avril)《girl friend》
《非诚勿扰》男嘉宾出场音乐插曲 jean roch 《can you feel it》
《非诚勿扰》男嘉宾失败退场插曲 梁静茹 《可惜不是你》
《非诚勿扰》男女嘉宾配对成功插曲 曹格 卓文萱 《梁山伯与朱丽叶》
《非诚勿扰》女嘉宾被选中走上台的音乐 少女时代 《Gee》,这个开始那声音太YD了

百度mp3的搜索歌曲名称下载就可以,部分歌曲已经在百度音乐盒中了,可以在线听的。整首歌听起来似乎也不那么好听了,还是剪辑之后的比较好,适合拿来做手机铃声哈。

Categories: 生活记录 Tags: