【NOIP2004】虫食算(搜索+高斯消元)
来源:互联网 发布:淘宝买家仅退款不退货 编辑:程序博客网 时间:2024/06/05 19:03
题意:给定一个n进制的竖式计算(n位数+n位数=n位数),相同字母表示相同的数,不同字母表示不同的数(填数游戏),保证有且仅有唯一解。
做法1:暴力虫食算暴力
做法2:搜索+高斯消元
每一位列一个方程,添加n个未知数,表示每一位的进位状况。
列方程:每一位:两个加数系数为1,和系数为-1,当前这一位系数-n,前一位系数1。
然后跑一遍高斯(肯定是解不出来的,未知数>方程数),然后dfs枚举进位的状态,算出未知数,检验是否合法。
代码:
#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<algorithm>using std::swap;#define MAXN 30int N,finalR,ans[MAXN];char eq[3][MAXN];int A[MAXN][MAXN*2];bool car[MAXN],vis[MAXN];int gcd(int a,int b){return b==0?a:gcd(b,a%b);}int lcm(int a,int b){return a/gcd(a,b)*b;}inline void Init_Matrix(){ memset(A,0,sizeof A); for(int i=N-1;i>=0;i--) { A[i+1][eq[0][i]-'A'+1]++; A[i+1][eq[1][i]-'A'+1]++; A[i+1][eq[2][i]-'A'+1]--; A[i+1][N+i+1]=-N; A[i+1][N+i+2]=1; A[i+1][N*2+1]=0; }}inline void Gauss(){ int r,c,mxr,n=N,m=N*2+1,l,ta,tb; for(r=1,c=1;r<=n&&c<m;r++,c++) { mxr=r; for(int i=r+1;i<=n;i++) if(abs(A[i][c])>abs(A[mxr][c])) mxr=i; if(A[mxr][c]==0) {r--;continue;} if(mxr!=r)swap(A[mxr],A[r]); for(int i=1;i<=n;i++) if(i!=r&&A[i][c]) { l=lcm(abs(A[i][c]),abs(A[r][c])); ta=l/A[i][c]; tb=l/A[r][c]; for(int j=c;j<=m;j++) A[i][j]=A[i][j]*ta-A[r][j]*tb; if(i<c) A[i][i]*=ta; } } finalR=r-1;}inline bool Check(){ memset(vis,0,sizeof vis); memset(ans,0,sizeof ans); int sum; for(int i=N;i>0;i--) { sum=A[i][N*2+1]; for(int j=N+1;j<=N*2;j++) sum-=A[i][j]*car[j-N]; if(sum%A[i][i])return 0; ans[i]=sum/A[i][i]; if(ans[i]<0||ans[i]>=N||vis[ans[i]])return 0; vis[ans[i]]=1; } for(int i=1;i<N;i++) printf("%d ",ans[i]); printf("%d\n",ans[N]); return 1;}void Enum_carry(int id){ if(id>N) { if(Check()) exit(0); return; } car[id]=0; Enum_carry(id+1); car[id]=1; Enum_carry(id+1);}int main(){ scanf("%d%s%s%s",&N,eq[0],eq[1],eq[2]); Init_Matrix(); Gauss(); Enum_carry(2); printf("Error\n"); return 0;}
1 2
- 【NOIP2004】虫食算(搜索+高斯消元)
- [NOIP2004]虫食算 - 高斯消元|搜索
- [NOIP2004][CODEVS1064]虫食算(搜索||高斯消元)
- [NOIP2004]虫食算【搜索】
- 【搜索】[NOIP2004]虫食算
- 【NOIP2004】虫食算 搜索+剪枝
- 【搜索】【NOIP2004】虫食算
- |洛谷|NOIP2004|搜索|P1092 虫食算
- [NOIP2004]虫食算 高斯消元
- 【NOIP2004】虫食算(暴力)
- 【搜索】【NOIP2004提高组】四、虫食算
- [NOIP2004]虫食算 T4 简单搜索+剪枝
- 【NOIP2004提高组T4】虫食算-搜索剪枝
- NOIP2004虫食算
- NOIP2004 虫食算
- 【NOIP2004】虫食算
- NOIP2004【虫食算】
- NOIP2004虫食算
- 加快UE4源码版同步引擎内容速度
- CART(二)
- 关于评论话题挖掘的研究及其实现代码(二)词图切分
- 自适应族
- HTTP客户端识别与Cookie机制
- 【NOIP2004】虫食算(搜索+高斯消元)
- iOS Objc Runtime 教程+实例Demo
- SVD分解理论
- revit二次开发——从族实例中取得几何信息
- 单例模式,你所应该知道的一切
- 在WebStorm里配置watcher实现编辑less文件时自动生成.map和压缩后的.css文件
- ℃江让您从精通到入门:第一次
- HDU1698 Just a Hook 线段树成段替换
- java设计模式之组合模式