高斯消元法第四个冠军,这个称号是非常令人兴奋~~



题目大意:

给出9个钟表的状态。给出九种操作,问最少要操作几次能把全部的钟表调回12点。



解题思路:

对于9个钟表分别列方程,然后高斯消元就可以。因为这次左边的方程系数不是0就是1,所以不用找最大值~





以下是代码:

#include <set>
#include <map>
#include <queue>
#include <math.h>
#include <vector>
#include <string>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm> #define eps 1e-6
#define pi acos(-1.0)
#define inf 107374182
#define inf64 1152921504606846976
#define lc l,m,tr<<1
#define rc m + 1,r,tr<<1|1
#define iabs(x) ((x) > 0 ? (x) : -(x))
#define clear1(A, X, SIZE) memset(A, X, sizeof(A[0]) * (SIZE))
#define clearall(A, X) memset(A, X, sizeof(A))
#define memcopy1(A , X, SIZE) memcpy(A , X ,sizeof(X[0])*(SIZE))
#define memcopyall(A, X) memcpy(A , X ,sizeof(X))
#define max( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define min( x, y ) ( ((x) < (y)) ? (x) : (y) ) using namespace std; struct node
{
long long num[15];
node()
{
clearall(num,0);
}
void clen()
{
clearall(num,0);
}
}; struct node matrix[15];
int n,m,len;
bool free_x[15]; long long X[15],p; void Debug(void)
{
puts("");
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < n + 1; j++)
{
cout << matrix[i].num[j] << " ";
}
cout << endl;
}
cout << endl;
} int Guass()
{
int i,j,k,col;
clearall(X,0);
clearall(free_x,1);//把解集清空,全部变量都标为自由变量 for (k = 0,col = 0; k < m && col < n; ++k, ++col) //枚举行列
{
//printf("%d\n",k);
//Debug();
int max_r = k;//找到该col列元素绝对值最大的那行与第k行交换.(为了在除法时减小误差) while(matrix[max_r].num[col]==0&&max_r<m)max_r++; /*for (i = k + 1; i < m; ++i)
{
if (iabs(matrix[i].num[col]) > iabs(matrix[max_r].num[col])) max_r = i;
}*/
if (max_r != k) //交换
{
for (i = k; i < n + 1; ++i) swap(matrix[k].num[i],matrix[max_r].num[i]);
}
/*if (matrix[k].num[col]!=0 ) //假设相应该列都为0,枚举该行的下一列
{
k--;
continue;
}*/
for (i = k + 1; i < m; ++i) //将k后边的col进行初等变换成行阶梯矩阵
{
if (matrix[i].num[col]!=0)
{
long long x1=matrix[i].num[col],x2=matrix[k].num[col];
for (j = col; j < n + 1; ++j)
{
matrix[i].num[j] = matrix[i].num[j] *x2- x1*matrix[k].num[j];
matrix[i].num[j] = (matrix[i].num[j]%p+p)%p;
}
//Debug();
}
}
} //Debug();
// 1. 无解的情况: 化简的增广阵中存在(0, 0, ..., a)这种行(a != 0). 即R(A) != R(A')无解
/*for (i = k; i < m; ++i)
{
if (iabs(matrix[i].num[col]) >eps) return -1;
}*/
// 2. 无穷解的情况: 在n * (n + 1)的增广阵中出现(0, 0, ..., 0)这种行。即说明没有形成严格的上三角阵.
// 且出现的行数即为自由变元的个数. 即R(A) = R(A') < n
//printf("%d %d\n",k,n);
/*if (k < n)
{
//凝视处为求多解的自由变量
// 首先,自由变元有n - k个。即不确定的变元至少有n - k个.
int num = 0,freeidx;
for (i = k - 1; i >= 0; --i)
{
num = 0;// 用于推断该行中的不确定的变元的个数。假设超过1个。则无法求解。它们仍然为不确定的变元.
double tmp = matrix[i].num[n];
// 第i行一定不会是(0, 0, ..., 0)的情况,由于这种行是在第k行到第m行.
// 相同。第i行一定不会是(0, 0, ..., a), a != 0的情况。这种无解的.
for (j = 0; j < n; ++j)
{
if (iabs(matrix[i].num[j]) > eps && free_x[j])
{
num++;
freeidx = j;
}
}
if (num > 1) continue; // 无法求解出确定的变元.
// 说明就仅仅有一个不确定的变元free_index,那么能够求解出该变元,且该变元是确定的.
tmp = matrix[i].num[n];
for (j = 0; j < n; ++j)
{
if (iabs(matrix[i].num[j])>eps && j != freeidx) tmp -= matrix[i].num[j]*X[j];
}
X[freeidx] = tmp/matrix[i].num[freeidx];
free_x[freeidx] = 0;
}
return n - k;
}*/
// 3. 唯一解的情况: 在n * (n + 1)的增广阵中形成严格的上三角阵.
// 计算出Xn-1, Xn-2 ... X0.
for (i = k - 1; i >= 0; --i)
{
long long tmp = matrix[i].num[n];
for (j = i + 1; j < n; ++j)
{
tmp =((tmp- matrix[i].num[j]*X[j])%p+p)%p;
}
while(tmp%matrix[i].num[i])tmp+=p;
X[i] = ((tmp/matrix[i].num[i])%p+p)%p;
}
return 0;
}
const char s[9][10]= {"ABDE","ABC","BCEF","ADG","BDEFH","CFI","DEGH","GHI","EFHI"};
const int num[9]= {4,3,4,3,5,3,4,3,4}; int main()
{
p=4;
n=9;
m=9;
clearall(matrix,0);
for(int i=0; i<9; i++)
{
scanf("%d",&matrix[i].num[9]);
matrix[i].num[9]=(4-matrix[i].num[9])%4;
for(int j=0; j<num[i];j++)
{
matrix[s[i][j]-'A'].num[i]=1;
}
}
//Debug();
Guass();
bool flat=false;
//Debug();
for(int i=0; i<n; i++)
{
//printf("%lld\n",X[i]);
for(int j=0;j<X[i];j++)
{
if(flat)printf(" ");
printf("%d",i+1);
flat=true;
}
}
//Debug();
puts("");
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

POJ 1166 The Clocks的更多相关文章

  1. Poj 1166 The Clocks(bfs)

    题目链接:http://poj.org/problem?id=1166 思路分析:题目要求求出一个最短的操作序列来使所有的clock为0,所以使用bfs: <1>被搜索结点的父子关系的组织 ...

  2. POJ 1166 The Clocks (暴搜)

    发现对这样的模拟题根本没啥思路了,本来准备用bfs的.可是结果超时了,这是參考别的人代码写的: #include <stdio.h> #include <iostream> # ...

  3. POJ 1166 The Clocks (爆搜 || 高斯消元)

    题目链接 题意: 输入提供9个钟表的位置(钟表的位置只能是0点.3点.6点.9点,分别用0.1.2.3)表示.而题目又提供了9的步骤表示可以用来调正钟的位置,例如1 ABDE表示此步可以在第一.二.四 ...

  4. POJ 1166 The Clocks 高斯消元 + exgcd(纯属瞎搞)

    依据题意可构造出方程组.方程组的每一个方程格式均为:C1*x1 + C2*x2 + ...... + C9*x9 = sum + 4*ki; 高斯消元构造上三角矩阵,以最后一个一行为例: C*x9 = ...

  5. POJ 1166 The Clocks [BFS] [位运算]

    1.题意:有一组3*3的只有时针的挂钟阵列,每个时钟只有0,3,6,9三种状态:对时针阵列有9种操作,每种操作只对特点的几个时钟拨一次针,即将时针顺时针波动90度,现在试求从初试状态到阵列全部指向0的 ...

  6. POJ 1166:The Clocks

    The Clocks Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15357   Accepted: 6230 Descr ...

  7. POJ 1166 暴力搜索 即 枚举

    e.... 米还是没有读懂题....T_T ..... e.... 这就是传说中的暴力吗....太血腥了....太暴力了...九重for循环....就这么赤裸裸的AC了.... 水是水了点..但是.. ...

  8. 高斯消元 分析 && 模板 (转载)

    转载自:http://hi.baidu.com/czyuan_acm/item/dce4e6f8a8c45f13d7ff8cda czyuan 先上模板: /* 用于求整数解得方程组. */ #inc ...

  9. 高斯消元法~get√

    高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. ...

随机推荐

  1. MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件

    原文  MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件 UI 前沿技术 WPF 中的多点触控操作事件 Charles Petzold 下载代码示例 就在过去几年,多点触控还只是科幻电 ...

  2. Unix/Linux环境C编程新手教程(24) MySQL 5.7.4 for Red Hat Enterprise 7(RHEL7)的安装

    远观历史, MySQL的主要目的是为了可以在单处理器核心的商业服务器上执行.现在MySQL的一个变化用户可能不会注意到,那就是甲骨文已经開始又一次架构MySQL的代码,使它大量的模块化.如软件解析器, ...

  3. EFM32在使用IAR开发环境配置ICf文件以及指定程序存储地址空间

    EFM32在IAR开发环境下指定代码,数据的存储空间 为了便于后续的项目升级,管理,需要对代码,数据的存储空间加以设定,也在网上找下相关的资料,笔者水平有限, 如下内容不一定完全正确,如有错误之后,还 ...

  4. 关于Linux路由表的route命令(转)

    查看 Linux 内核路由表 使用下面的 route 命令可以查看 Linux 内核路由表. # route Destination  Gateway      Genmask          Fl ...

  5. cocos2d-x 制作资源下载页面

    开发游戏中用到从http 服务器下载文件的操作,所以要有个界面显示下载进度,同时联网采用curl库,因为下载是同步的操作,所以用了多线程 啥也不说,直接贴代码.我是采用ccbi做的页面,你也可以做一个 ...

  6. Oracle管道函数(Pipelined Table Function)介绍

    一 概述: 1.管道函数即是能够返回行集合(能够使嵌套表nested table 或数组 varray)的函数,我们能够像查询物理表一样查询它或者将其  赋值给集合变量. 2.管道函数为并行运行,在普 ...

  7. Linux注销在线用户

    与Windows系统类似,Linux系统上也有注销在线用户的方法,我们可以使用pkill命令,详细的步骤如下: . 首先使用w或who命令查看在线用户,确定用户所在TTY [root@iavp232 ...

  8. oracle维护表空间和数据文件

    1:重要参考 wiki 2: oracle doc 表空间参考 3:来自dba-oracle的参考 26,27,28,29 一:oracle 表空间概念 表空间是联系数据库的物理磁盘(数据文件)和逻辑 ...

  9. poj 2126 Factoring a Polynomial 数学多项式分解

    题意: 给一个多项式,求它在实数域内的可分解性. 分析: 代数基本定理. 代码: //poj 2126 //sep9 #include <iostream> using namespace ...

  10. OCP-1Z0-051-题目解析-第33题

    33. You want to create an ORD_DETAIL table to store details for an order placed having the following ...