Gym 100496A Avangard Latin Squares(矩阵游戏)
2015-07-13 20:23
190 查看
题意:输入一个n,表示在n*n的矩阵中填1~n,使每行每列以及所有正对角线所有反对角线均出现1~n一次。若存在,输出Yes和矩阵,否则输出No;
思路:比赛的时候没思路。将1~n换为0~n较好处理一些。先只考虑0的位置,每行将0向一个方向移动固定格子数,枚举所需的移动步数,
若满足条件(无同行同列同对角线)则Yes,1~n以相同步数移动;否则为No;
思路:比赛的时候没思路。将1~n换为0~n较好处理一些。先只考虑0的位置,每行将0向一个方向移动固定格子数,枚举所需的移动步数,
若满足条件(无同行同列同对角线)则Yes,1~n以相同步数移动;否则为No;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,flag; int pos[5050],pre[5050]; int main() { freopen("avangard.in","r",stdin); freopen("avangard.out","w",stdout); int i,j,k,cnt; while(scanf("%d",&n)!=EOF) { cnt=0; for(i=2;i<n-1;i++)//枚举移动格数 { flag=1; for(j=1;j<n;j++)//枚举移动次数 { cnt=i*j%n;//0所在位置 if(cnt==0) flag=0;//同列 else if(cnt==j) flag=0;//正对角线上 else if((cnt+j)==n) flag=0;//反对角线上 } if(flag==1) { cnt=i;break; } } if(n==1) { printf("Yes\n");printf("1\n");continue; } for(i=1;i<=n;i++) pos[i]=i; if(!flag) printf("No\n"); else{ printf("Yes\n"); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) pre[pos[j]]=j; for(j=1;j<=n;j++) { if(j==1) printf("%d",pre[j]); else printf(" %d",pre[j]); }printf("\n"); for(j=1;j<=n;j++) { pos[j]+=cnt;//位置右移,即数左移 if(pos[j]>n) pos[j]-=n; } } } } return 0; }
相关文章推荐
- JSP 标准标签库(JSTL)之最常用的JSTL标签总结
- const型变量与函数重载
- CXF WebService整合Spring
- 算法导论 第五章:随机算法
- 类的const和非const成员函数的重载
- hdu 4908 BestCoder Sequence 发现M中值是字符串数, 需要预处理
- C++ 学习之函数重载、基于const的重载
- javaWeb
- 跟着实例学习设计模式(8)-适配器模式adapter(结构型)
- Linux下使用Caffe对图片进行训练并分类的简单流程
- [C++] const与重载
- CPU上涨100%的问题排查
- php中文乱码问题分析及解决办法
- C++中const重载
- 最大下标距离(算法)
- swift 集合类
- 浅谈继承关系和接口
- 二维“有序”数组查找问题的解决
- 【上海交大oj】能量项链(动态规划)
- vs2010下C++调用lib或dll文件