博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 1998 奇数阶魔方(找规律+模拟)
阅读量:4954 次
发布时间:2019-06-12

本文共 1928 字,大约阅读时间需要 6 分钟。

应该不算太水吧。

17  24   1   8  15

  23   5   7  14  16
   4   6  13  20  22
  10  12  19  21   3
  11  18  25   2   9

对于上面的数据,根据题目中的提示,很容易就看到对角线上的数字是11、12、13、14、15。其他的数据,比如说2,从2往右上查就是2、3、4、5、1。描述起来好像很麻烦,但是对着图看一下就可以很容易看明白。

接下来继续观察数据,我们可以看出在第一行实际上是从1开始往右查每个数字逐个加上n+2,往左先是n*n-1,然后依次减去n+2。第一行和最后一行根据中心点对称的两个数字的和是n*n+1,比如说17+9=25+1,24+2=25+1。

有了这两个规律,仅凭直觉,我们都可以确定用来模拟出结果已经足够了。模拟的方法很多,我的方法是将1~n^2分成n段,用第一行的每个数字来确定它所在的斜边的最小值和最大值,比如说对于17,在16、17、18、19、20这个序列中,最小值就是17/5*5+1=16,最大值是(17+5)/5*5=20。有了这两个值,这一个序列的值就很容易确定了。

1A。

 

#include
#include
#define N 21int map[N][N];int main(){ int n; int T; scanf("%d",&T); while(T--) { scanf("%d",&n); int x=n+1; int y=x/2; memset(map,0,sizeof(map)); map[1][y]=1; map[n][y]=n*n; int temp=n+2; int i,j; i=y-1; j=y+1; int tempx,tempy; tempx=n*n-1; tempy=1+temp; while(i>=1&&j<=n) { map[1][i]=tempx; i--; tempx-=temp; map[1][j]=tempy; j++; tempy+=temp; } temp=1+n*n; for(i=1; i<=n; i++) map[n][i]=temp-map[1][n+1-i]; int start,end; int l,k; for(j=1; j
0; l++,k--) { if(map[l-1][k+1]!=start) map[l][k]=map[l-1][k+1]-1; else map[l][k]=end; } for(l=n-1,k=j+2; l>=1&&k<=n; l--,k++) { if(map[l+1][k-1]!=end) map[l][k]=map[l+1][k-1]+1; else map[l][k]=start; } } for(l=2,k=n-1; l<=n&&k>=1; l++,k--) { map[l][k]=map[l-1][k+1]-1; } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) printf("%4d",map[i][j]); printf("\n"); } } return 0;}

 

 

转载于:https://www.cnblogs.com/jiangu66/p/3172381.html

你可能感兴趣的文章
单链表的翻转,插入,删除,遍历操作
查看>>
手机号码和邮箱等联系地址,为什么不明文显示?
查看>>
一步一步学Linq to sql六:延迟执行(非原创)
查看>>
[Vue]vue-router的push和replace的区别
查看>>
Git Windows客户端保存用户名与密码
查看>>
树莓派3B+(二)
查看>>
android,解决ListView,GridView滑动冲突。
查看>>
常用dos命令
查看>>
python学习小结_190611
查看>>
near指针和far指针
查看>>
php Captcha 練習
查看>>
JAVA抓取一个HTML源代码
查看>>
实现搜索功能
查看>>
[mysql] 常用命令一
查看>>
centos7 安装python3.6 脚本
查看>>
linux一步一脚印---mkdir命令
查看>>
加密芯片那些事儿
查看>>
2017秋-软件工程第五次作业(1)-【探路者】团队选题展示
查看>>
REX:EOS资源租赁平台详解
查看>>
初识jmeter2
查看>>