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

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

2010-10-20 12:15
159669
收藏
免费 0
支持
分享
最新回复 (152)
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
126
直观想的算法无论怎么优化也要几十秒,不出来丢人了。
2010-10-21 00:14
0
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
127
http://topic.csdn.net/t/20060209/09/4546626.html
2010-10-21 00:27
0
雪    币: 130
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
128
汗,这么多高手啊
2010-10-21 00:59
0
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
129
从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; 
} 




2010-10-21 01:09
0
雪    币: 9
活跃值: (142)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
130
DUMP时候老是出错
2010-10-21 02:36
0
雪    币: 1126
活跃值: (156)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
131
提供一下答案检测工具。答题的人有需要。

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

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

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

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

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

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

这样估计没有人反对了。

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

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