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



题目大意:

给出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. Thread.sleep还是TimeUnit.SECONDS.sleep

    转http://stevex.blog.51cto.com/4300375/1285767/ 刚看到TimeUnit.SECONDS.sleep()方法时觉得挺奇怪的,这里怎么也提供sleep方法? ...

  2. Spring Thread Pool 线程池的应用

    Spring and Java Thread example 扫扫关注"茶爸爸"微信公众号 坚持最初的执着,从不曾有半点懈怠,为优秀而努力,为证明自己而活. Download it ...

  3. 华为OJ:计算两个自然时间相加

    按要求一步步做就好 import java.util.Scanner; public class dateAdd { public static void main(String args[]){ S ...

  4. P65

    #include<stdio.h> #define N 6 main() { char c[N]; int i=0; for(;i<N;c[i]=getchar(),i++); pr ...

  5. Windows NT 技术简介

    Windows NT 技术简介 NT:New Technoly(新技术,因比DOS.WIN9X采用了很多新技术而得名) Windows NT基本介绍 WindowsNT是Microsoft推出的面向工 ...

  6. python gzip 压缩文件

    压缩数据创建gzip文件 先看一个略麻烦的做法 ? 1 2 3 4 5 6 import StringIO,gzip content = 'Life is short.I use python' zb ...

  7. AngularJS_百度百科

    AngularJS_百度百科     AngularJS    编辑     AngularJS是为克服HTML在构建应用上的不足而设计的.    目录         1简介引引        端对 ...

  8. android怎样实现自动点击功能

    一个按钮之类的控件的自动点击的话,可以定时调用 button.performClick();

  9. C++操作符的优先级

    C++操作符的优先级 C++操作符的优先级 操作符及其结合性 功能 用法 L L L :: :: :: 全局作用域 类作用域 名字空间作用域 ::name class::name namespace: ...

  10. 一起C语言中程序时序问题的排查过程

    [文章摘要] 对于由多个模块协同工作的软件来说,程序处理的时序是很重要的.当消息处理的顺序出现混乱时,程序就会出现异常. 本文基于作者的实际项目经验.对软件模块之间的时序问题进行了具体的分析,为相关软 ...