能力值:
( LV2,RANK:10 )
|
-
-
126 楼
直观想的算法无论怎么优化也要几十秒,不出来丢人了。
|
能力值:
( LV2,RANK:10 )
|
-
-
127 楼
http://topic.csdn.net/t/20060209/09/4546626.html
|
能力值:
( LV2,RANK:10 )
|
-
-
128 楼
汗,这么多高手啊
|
能力值:
( 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;
}
|
能力值:
( LV12,RANK:200 )
|
-
-
130 楼
DUMP时候老是出错
|
能力值:
( LV9,RANK:210 )
|
-
-
131 楼
提供一下答案检测工具。答题的人有需要。 检测答案正确性:
输入:
1. 输入文件同目录下"result.txt";
2. 格式必须满足题目要求; 输入个数必须7040个(个数不对会异常哦, 没做个数检测);
功能:
1. 单个幻方的正确性; 行列对角线和检测; 数字有效性, 唯一性;
2. 所有幻方的唯一性; 每个幻方进行比较;
输出:
如果出现1错误, 则显示"Case xx";
如果出现2错误, 则显示"Case xx Case yy"
如果没有错误则显示"OK";
|
能力值:
( LV15,RANK:2473 )
|
-
-
132 楼
楼上闲得无聊了,哈哈
|
能力值:
( LV2,RANK:10 )
|
-
-
133 楼
这题作废不?vxk都已经提交代码了,,
|
能力值:
( LV2,RANK:10 )
|
-
-
134 楼
现在貌似不允许讨论。
|
能力值:
(RANK:1130 )
|
-
-
135 楼
能不能写一个测速度的程序出来?
现在测试运行时间很重要
|
能力值:
( LV15,RANK:670 )
|
-
-
136 楼
TX在海选
|
能力值:
( LV2,RANK:10 )
|
-
-
137 楼
昨天下午差点就把csdn上某份代码修改后提交了
还好没提交 跟v校那份竟然一个来源
|
能力值:
( LV2,RANK:10 )
|
-
-
138 楼
支持
不过 跟自己电脑硬件也有关吧
|
能力值:
( LV4,RANK:50 )
|
-
-
139 楼
感觉到更强的牛人在旁观。。。
冥冥之中自有定数。。。
|
能力值:
( LV15,RANK:1473 )
|
-
-
140 楼
累死我了,自己设计了个想法,从600ms终于优化到100ms左右了。。。
大牛们现在讨论的是10ms以内的想法了,差距啊
|
能力值:
( LV5,RANK:69 )
|
-
-
141 楼
看看回复也有收获
|
能力值:
( LV9,RANK:210 )
|
-
-
142 楼
我也测试过,同一个程序,连续几次运行,都有几倍的时间差。
我有个想法,用虚拟机执行或者调试执行,各种或者各类指令的执行次数来算?
只计算关键部分的指令条数。
至于跳转指令时间要多一些,因为会造成cpu重新预取(不过也不好衡量,而且即使不跳转,CPU执行速度也与指令顺序有关系)。
这样估计没有人反对了。
对于这个比赛,没必要绝对精确啊。
|
能力值:
(RANK:1130 )
|
-
-
143 楼
如果像上一题那样的算分规则。。。。
|
能力值:
( LV9,RANK:250 )
|
-
-
144 楼
YY 吧你。
追求20ms,竟然都讨论到10ms了 --!
|
能力值:
( LV4,RANK:50 )
|
-
-
145 楼
.......
|
能力值:
( LV8,RANK:130 )
|
-
-
146 楼
。。。。真的?
|
能力值:
( LV12,RANK:760 )
|
-
-
147 楼
话说,我只是在debugman娱乐。不参加比赛,话说ipad 64GB wifi我都有一台了。
|
能力值:
(RANK:1290 )
|
-
-
148 楼
这题其实是在考看谁输出的快, 把printf去掉。运行 0ms...
IBM T400
|
能力值:
( LV12,RANK:403 )
|
-
-
149 楼
0ms?这也太快了,不会是编译器做优化把循环内的无用功代码去掉了?
膜拜
|
能力值:
( LV2,RANK:10 )
|
-
-
150 楼
计算指令条数也不行啊,不同的汇编指令执行的时钟周期数是不同的。如果a*32,
你用乘法指令,(忘记准确的了,大概是这样)mul xxxxx,时钟周期会很长。
如果用移位shl a,5,只要1个周期
|
|
|