CF618B - Guess the Permutation
2016-01-30 12:51
459 查看
题目大意:有n个数1~n的全排列,给你一个n*n的矩阵,Aij表示第i位和第j位中较小的哪一个,对角线是0,求原数列。
这么考虑,首先1与其他比较肯定1是最小的,那一行肯定除了对角线的0,其他全是1。这样,找到1的位置。接下来,把矩阵中所有1变成2,找到的那一行标记为“占用”,然后去找“非占用”的行中除了0全是2的那一行,确定2的位置,以此类推。
这么考虑,首先1与其他比较肯定1是最小的,那一行肯定除了对角线的0,其他全是1。这样,找到1的位置。接下来,把矩阵中所有1变成2,找到的那一行标记为“占用”,然后去找“非占用”的行中除了0全是2的那一行,确定2的位置,以此类推。
#include<cstdio> #include<iostream> #include<cstring> #include<string> #include<algorithm> #include<cmath> using namespace std; int n; int a[55][55]; int anss[55]; bool v[55]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++)scanf("%d",&a[i][j]); } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ if(anss[i]==0){ int ji=0; for(int j=1;j<=n;j++){ if(a[i][j]==k)ji++; } if(ji==n-1){ anss[i]=k; break; } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(a[i][j]==k)a[i][j]=k+1; } } /* for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++)printf("%d ",a[i][j]); printf("\n"); } printf("\n");*/ } for(int i=1;i<n;i++)printf("%d ",anss[i]); printf("%d\n",anss ); return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- Transformation 能将 Windows XP/Server 2003 操作系统,完美地模拟成 Windows Vista 的软件
- C++联合体转换成C#结构的实现方法
- 用javascript和css模拟select的脚本
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例