首页
社区
课程
招聘
[题目][第一阶段 第二题]『深圳腾讯2010安全技术竞赛』
2010-10-20 12:15 159326

[题目][第一阶段 第二题]『深圳腾讯2010安全技术竞赛』

2010-10-20 12:15
159326
收藏
点赞0
打赏
分享
最新回复 (152)
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
nooning 2010-10-21 00:14
126
0
直观想的算法无论怎么优化也要几十秒,不出来丢人了。
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
雪yaojun 2010-10-21 00:27
127
0
http://topic.csdn.net/t/20060209/09/4546626.html
雪    币: 130
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
flzep 2010-10-21 00:59
128
0
汗,这么多高手啊
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
雪yaojun 2010-10-21 01:09
129
0
从CSDN上面找的,只能计算出一组,速度还真快.
把代码整理了一下。。看不懂哇。。。
#include   <iostream> 
#include   <list> 
using   namespace   std; 
#define   MSIZE   100 
int   temp1[MSIZE+1][MSIZE+1]; 
int   temp2[MSIZE+1][MSIZE+1]; 
int   temp3[MSIZE+1][MSIZE+1]; 
int   temp4[MSIZE+1][MSIZE+1]; 
int   Magic[MSIZE+1][MSIZE+1]; 
//**************************** 
int mmod(int a,int b) 
{ 
	if(a>=0) 
		return a%b; 
	else   
		return b-(-a%b); 
} 

 
void Swap(int& a,int& b) 
{ 
	int t=a; 
	a=b; 
	b=t; 
} 


void   SetMagic(int size) 
{ 
	int   i,j; 
	if(size%2==1) 
	{ 
		for(i=1;i <=size;i++) 
			for(j=1;j <=size;j++) 
			{ 
				temp1[i][j]=i; 
				temp2[i][j]=j; 
			//	printf("temp1[%d][%d]=%d,temp2[%d][%d]=%d\n",i,j,temp1[i][j],i,j,temp2[i][j]);
			} 
		for(i=1;i <=size;i++) 
			for(j=1;j <=size;j++) 
			{ 
				temp3[i][j]=mmod(temp1[i][j]+temp2[i][j]-(size+3)/2,size); 
				temp4[i][j]=mmod(temp1[i][j]+2*temp2[i][j]-2,size); 
			} 
		for(i=1;i <=size;i++) 
			for(j=1;j <=size;j++) 
				Magic[i][j]=size*temp3[i][j]+temp4[i][j]+1; 
	}
	else if(size%4==0) 
	{ 
		for(i=1;i <=size;i++) 
		for(j=1;j <=size;j++) 
		{ 
			temp1[i][j]=i; 
			temp2[i][j]=j; 
		} 
		for(i=1;i <=size;i++) 
			for(j=1;j <=size;j++) 
				temp3[i][j]=(temp1[i][j]%4)/2==(temp2[i][j]%4)/2?1:0; 
		for(i=1;i <=size;i++) 
			for(j=1;j <=size;j++) 
				temp4[i][j]=size*(i-1)+j; 
		for(i=1;i<=size;i++) 
			for(j=1;j<=size;j++) 
				if(temp3[i][j]==1) 
					Magic[i][j]=size*size+1-temp4[i][j]; 
				else 
					Magic[i][j]=temp4[i][j]; 
	}
	else 
	{ 
		int   p=size/2; 
		SetMagic(p); 
		for(i=1;i <=size;i++) 
			for(j=1;j <=size;j++) 
				if(i <=p&&j <=p) 
					temp1[i][j]=Magic[i][j]; 
				else if(i <=p&&j> p) 
					temp1[i][j]=Magic[i][j-p]+2*p*p; 
				else if(i> p&&j <=p) 
					temp1[i][j]=Magic[i-p][j]+3*p*p; 
				else 
					temp1[i][j]=Magic[i-p][j-p]+p*p; 
		int k=(size-2)/4; 
		list <int> lj; 
		for(i=1;i <=k;i++)   
				lj.push_back(i); 
		if(k==2)   
		{ 
			lj.push_back(size); 
		} 
		else   if(k> 2) 
		{ 
			lj.push_back(size-k+2); 
			lj.push_back(size); 
		} 
		else 
		{//do   nothing 
		} 
		for(list <int> ::iterator itrj=lj.begin();itrj!=lj.end();itrj++) 
			for(i=1;i <=p;i++) 
				Swap(temp1[i][*itrj],temp1[p+i][*itrj]); 
		lj.clear(); 
		lj.push_back(1); 
		lj.push_back(k+1); 
		for(itrj=lj.begin();itrj!=lj.end();itrj++) 
			Swap(temp1[k+1][*itrj],temp1[k+1+p][*itrj]); 
		memcpy(Magic,temp1,(MSIZE+1)*(MSIZE+1)*sizeof(int)); 
	} 
}
//*********************************** 
//void   prin() 
//{ 
//printf( "func:   %sn ",__FUNC__); 
//} 

void   main(void) 
{ 
	int   n; 
	cout << "Please   input   a   integer: "; 
	cin>> n; 
	if(n==2||n <1)   
	{ 
		cout << "The   magic   square   of   size   " <<n << "   does   not   exist. " <<endl; 
		return; 
	} 

	SetMagic(n); 
	for(int   i=1;i <=n;i++) 
	{ 
		for(int   j=1;j <=n;j++) 
		{ 
			cout.width(4); 
			cout <<Magic[i][j] << "   "; 
		} 
		cout <<endl; 
	} 
	return; 
} 




雪    币: 19
活跃值: (102)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
不死神鸟 1 2010-10-21 02:36
130
0
DUMP时候老是出错
雪    币: 1126
活跃值: (156)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
DiKeN 5 2010-10-21 08:27
131
0
提供一下答案检测工具。答题的人有需要。

检测答案正确性:
输入:
1. 输入文件同目录下"result.txt";
2. 格式必须满足题目要求; 输入个数必须7040个(个数不对会异常哦, 没做个数检测);
功能:
1. 单个幻方的正确性; 行列对角线和检测; 数字有效性, 唯一性;
2. 所有幻方的唯一性; 每个幻方进行比较;
输出:
如果出现1错误, 则显示"Case xx";
如果出现2错误, 则显示"Case xx Case yy"
如果没有错误则显示"OK";
上传的附件:
雪    币: 8188
活跃值: (4243)
能力值: ( LV15,RANK:2459 )
在线值:
发帖
回帖
粉丝
ccfer 16 2010-10-21 09:38
132
0
楼上闲得无聊了,哈哈
雪    币: 103
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
justFWD 2010-10-21 09:53
133
0
这题作废不?vxk都已经提交代码了,,
雪    币: 2687
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
溯雪 2010-10-21 09:59
134
0
现在貌似不允许讨论。
雪    币: 7300
活跃值: (3758)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
海风月影 22 2010-10-21 10:00
135
0
能不能写一个测速度的程序出来?
现在测试运行时间很重要
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
cntrump 13 2010-10-21 10:24
136
0
TX在海选
雪    币: 1407
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
liangdong 2010-10-21 11:36
137
0
昨天下午差点就把csdn上某份代码修改后提交了
还好没提交 跟v校那份竟然一个来源
雪    币: 358
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
疯子鱼 2010-10-21 12:00
138
0
支持

不过 跟自己电脑硬件也有关吧
雪    币: 625
活跃值: (1047)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
xzchina 1 2010-10-21 12:32
139
0
感觉到更强的牛人在旁观。。。

冥冥之中自有定数。。。
雪    币: 6051
活跃值: (1441)
能力值: ( LV15,RANK:1473 )
在线值:
发帖
回帖
粉丝
lelfei 23 2010-10-21 14:13
140
0
累死我了,自己设计了个想法,从600ms终于优化到100ms左右了。。。

大牛们现在讨论的是10ms以内的想法了,差距啊
雪    币: 377
活跃值: (3437)
能力值: ( LV5,RANK:69 )
在线值:
发帖
回帖
粉丝
小菜鸟一 2010-10-21 14:46
141
0
看看回复也有收获
雪    币: 1126
活跃值: (156)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
DiKeN 5 2010-10-21 15:58
142
0
我也测试过,同一个程序,连续几次运行,都有几倍的时间差。

我有个想法,用虚拟机执行或者调试执行,各种或者各类指令的执行次数来算?
只计算关键部分的指令条数。

至于跳转指令时间要多一些,因为会造成cpu重新预取(不过也不好衡量,而且即使不跳转,CPU执行速度也与指令顺序有关系)。

这样估计没有人反对了。

对于这个比赛,没必要绝对精确啊。
雪    币: 7300
活跃值: (3758)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
海风月影 22 2010-10-21 16:03
143
0
如果像上一题那样的算分规则。。。。
雪    币: 360
活跃值: (77)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
popeylj 6 2010-10-21 16:07
144
0
YY 吧你。

追求20ms,竟然都讨论到10ms了 --!
雪    币: 625
活跃值: (1047)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
xzchina 1 2010-10-21 16:27
145
0
.......
雪    币: 251
活跃值: (77)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
binarystar 3 2010-10-21 17:51
146
0
。。。。真的?
雪    币: 8861
活跃值: (2369)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2010-10-21 18:30
147
0
话说,我只是在debugman娱乐。不参加比赛,话说ipad 64GB wifi我都有一台了。
雪    币: 7115
活跃值: (644)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
玩命 31 2010-10-22 05:25
148
0
这题其实是在考看谁输出的快, 把printf去掉。运行 0ms...  
IBM T400
雪    币: 993
活跃值: (437)
能力值: ( LV12,RANK:403 )
在线值:
发帖
回帖
粉丝
Loka 2 2010-10-22 08:05
149
0
0ms?这也太快了,不会是编译器做优化把循环内的无用功代码去掉了?
膜拜
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
aait 2010-10-22 08:36
150
0
计算指令条数也不行啊,不同的汇编指令执行的时钟周期数是不同的。如果a*32,
你用乘法指令,(忘记准确的了,大概是这样)mul xxxxx,时钟周期会很长。
如果用移位shl a,5,只要1个周期
游客
登录 | 注册 方可回帖
返回