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



题目大意:

给出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. 分享非常有用的Java程序 (关键代码)(四)---动态改变数组的大小

    原文:分享非常有用的Java程序 (关键代码)(四)---动态改变数组的大小 /** * Reallocates an array with a new size, and copies the co ...

  2. ios qq 分享 失败

    1. TencentOAuth 是需要调用,但QQ代码共享是没有解释.共享代码如下面: TencentOAuth *auth = [[TencentOAuth alloc] initWithAppId ...

  3. MySql连接问题

    今天想通过命令连接到另外一台主机的Mysql 命令: mysql -h ip -u username -p EnterPassWord: password 连接成功

  4. javascript笔记整理(运算符 )

    1.运算符和操作数的组合就称为表达式. 2.算术运算符(+ - * / % a++ a-- --a ++a) a.+ 1.用于数值计算:var a=1;var b=2;alert(a+b)===3 2 ...

  5. android studio 怎么运行java

    方法/步骤 1.新建一个project,或者如果已经有project的话,那就直接新建一个module.注意选择Java library,然后下一步 2.输入module的一些信息.点击finish ...

  6. linux 下vi中关于删除某段,某行,或者全部删除的命令

    1,先打开某个文件: vi   filename 2,转到文件结尾 在命令模式输入 G       转到10行 在命令模式输入 10G 4,删除所有内容:先用G 转到文件尾,然后使用下面命令: :1, ...

  7. 瑞蓝RL-NDVM-A16网络视频解码器 视频上墙解决方案专家--数字视频解码矩阵

    瑞蓝网络数字视频解码矩阵(简称RL-NDVM)是依据第三代开放式网络视频监控系统的实际需求,专为视频上墙显示而研制的一款新型数字解码上墙设备.RL-NDVM解码矩阵是集解码器和HDMI/DVI/VGA ...

  8. Swift - 同步请求获取网络数据

    使用NSURLConnection可以实现http通信.它提供了异步请求和同步请求两种通信方式. 注意:同步请求数据会造成主线程阻塞,必须请求结束后用户才能做其他的操作,所有通常在请求大数据或者网络不 ...

  9. DEBUG模式下, 内存中的变量地址分析

    测试函数的模板实现 /// @file my_template.h /// @brief 测试数据类型用的模板实现 #ifndef MY_TEMPLATE_H_2016_0123_1226 #defi ...

  10. 多屏广告技术调研 & 广告基础介绍

    之前做的多屏广告产品调研,并简单介绍了一些基础广告知识.见ppt:多屏广告技术调研