POJ 1166 The Clocks
高斯消元法第四个冠军,这个称号是非常令人兴奋~~
题目大意:
给出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的更多相关文章
- Poj 1166 The Clocks(bfs)
题目链接:http://poj.org/problem?id=1166 思路分析:题目要求求出一个最短的操作序列来使所有的clock为0,所以使用bfs: <1>被搜索结点的父子关系的组织 ...
- POJ 1166 The Clocks (暴搜)
发现对这样的模拟题根本没啥思路了,本来准备用bfs的.可是结果超时了,这是參考别的人代码写的: #include <stdio.h> #include <iostream> # ...
- POJ 1166 The Clocks (爆搜 || 高斯消元)
题目链接 题意: 输入提供9个钟表的位置(钟表的位置只能是0点.3点.6点.9点,分别用0.1.2.3)表示.而题目又提供了9的步骤表示可以用来调正钟的位置,例如1 ABDE表示此步可以在第一.二.四 ...
- POJ 1166 The Clocks 高斯消元 + exgcd(纯属瞎搞)
依据题意可构造出方程组.方程组的每一个方程格式均为:C1*x1 + C2*x2 + ...... + C9*x9 = sum + 4*ki; 高斯消元构造上三角矩阵,以最后一个一行为例: C*x9 = ...
- POJ 1166 The Clocks [BFS] [位运算]
1.题意:有一组3*3的只有时针的挂钟阵列,每个时钟只有0,3,6,9三种状态:对时针阵列有9种操作,每种操作只对特点的几个时钟拨一次针,即将时针顺时针波动90度,现在试求从初试状态到阵列全部指向0的 ...
- POJ 1166:The Clocks
The Clocks Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15357 Accepted: 6230 Descr ...
- POJ 1166 暴力搜索 即 枚举
e.... 米还是没有读懂题....T_T ..... e.... 这就是传说中的暴力吗....太血腥了....太暴力了...九重for循环....就这么赤裸裸的AC了.... 水是水了点..但是.. ...
- 高斯消元 分析 && 模板 (转载)
转载自:http://hi.baidu.com/czyuan_acm/item/dce4e6f8a8c45f13d7ff8cda czyuan 先上模板: /* 用于求整数解得方程组. */ #inc ...
- 高斯消元法~get√
高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. ...
随机推荐
- Android Studio安装教程
Google在2013 I/O大会上发布Android Studio之后,广大Android开发者欢欣鼓舞,不过很快就有人出现问题,Android Studio无法安装,或者安装后无法启动,这篇文章就 ...
- ORACLE客户端乱码
sqlplus 打开CMD窗口,出现乱码情况的解决办法 C:\Documents and Settings>set NLS_LANG=american_america.AL32UTF8 C:\D ...
- Python 对Twitter中指定话题的被转载Tweet数量的频谱分析
CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-10 @author: guaguastd @name: r ...
- #AOS应用基础平台# 添加了用户自己定义快捷菜单在平铺布局下的用户自己定义排序管理
#AOS开发平台# 添加了用户自己定义快捷菜单在平铺布局下的用户自己定义排序管理.
- JS图片上传后base64转码
代码: // 获取文件流 var fileObj = document.getElementById('inputId').files; // 实例化一个FileReader对象 var reader ...
- c++,为什么要引入虚拟继承
虚拟基类是为解决多重继承而出现的. 以下面的一个例子为例: #include <iostream.h> #include <memory.h> class CA { i ...
- 如何使用NArrange进行代码优化
Narrange是一个.NET代码管理工具.它可以对源代码自动进行美化和把类成员分成一个组.区域.目前支持C#.VB.NET,将来会支持更多.NET上的语言. 主要的作用是: ◆ 减少程序员的开发时间 ...
- js下firstElementChild firstChild 以及childNodes和children方法
一. <div> <p>123</p> </div> 在上面这段代码中,如果使用以下js代码 var oDiv=document.getElementB ...
- VC2008下使用OpenSSL 1.0.0g(免编译)
OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库.SSL协议库以及应用程序. 官网:http://www.openssl.org/OpenSSL for Windows:http:/ ...
- java学习笔记-继承中super关键字
背景: 在java继承的概念中我们得知,被声明为私有的类成员对所属的类来说仍然是私有的.类之外的任何代码都不能访问,包括子类. super关键字的两种用法: 1.用于调用超类的构造函数: 2.用于访问 ...