您的位置:首页 > 其它

hdu4200&&hdu3364 高斯消元

2012-09-14 12:21 204 查看
基础题目,犯了个小错误,调了很久,甭提多郁闷了,不多说了,直接贴代码。

4200ACcode:

#include<stdio.h>
#include<string.h>
#define min(a,b) a<b?a:b;
#define max(a,b) a>b?a:b;

int n,d,row,col,ans;
char g[110][110];
int num[110];

void gauss()
{
int i,j,k;
for (col=row=1;col<=n;col++)
{
for (i=row;i<=n;i++) if (g[i][col]) break;
if (i>n) continue;
if (i!=row) for (j=col;j<=n+1;j++)
k=g[i][j],g[i][j]=g[row][j],g[row][j]=k;
for (i=row+1;i<=n;i++) if (g[i][col])
for (j=col;j<=n+1;j++) g[i][j]^=g[row][j];
row++;
}
return ;
}

void dfs(int k)
{
if (k<=n)
{
num[k]=1,dfs(k+1);
num[k]=0,dfs(k+1);
}
else
{
int i,j;
for (i=row-1;i>0;i--)
{
k=g[i][n+1];
for (j=i+1;j<=n;j++) k^=g[i][j]&&num[j];
num[i]=k;
}
for (i=1,k=0;i<=n;i++) k+=num[i];
ans=min(k,ans);
}
return ;
}

int main()
{
int i,j,k,t,L,R;
scanf("%d",&t);
while (t--)
{
scanf("%d %d",&n,&d);
memset(g,0,sizeof(g));
for (i=1;i<=n;i++)
{
scanf("%d",&g[i][n+1]);
L=max(1,i-d);
R=min(n,i+d);
for (j=L;j<=R;j++) g[j][i]=1;
}
ans=110,gauss();
for (i=row;i<=n;i++) if (g[i][n+1]) break;
if (i<=n) ans=-1;
for (i=1;i<row;i++)
{
if (!g[i][i])
{
for (j=i+1;j<=n;j++) if (g[i][j]) break;
if (j>n) break;
for (k=1;k<=n;k++)
R=g[k][j],g[k][j]=g[k][i],g[k][i]=R;
}
}
if (ans>0) dfs(row);
printf(ans==-1?"impossible\n":"%d\n",ans);
}
return 0;
}


3364ACcode:

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

const int size=55;

int n,m;
int a[size][size],g[size][size];

__int64 gauss()
{
int i,j,k;
int row=1,col=1;
for (;col<=m;col++)
{
for (i=row;i<=n;i++) if (g[i][col]) break;
if (i>n) continue;
if (i!=row) for (j=col;j<=m+1;j++)
k=g[row][j],g[row][j]=g[i][j],g[i][j]=k;
for (i=row+1;i<=n;i++) if (g[i][col])
for (j=col;j<=m+1;j++) g[i][j]=g[i][j]^g[row][j];
row++;
}
for (i=row;i<=n;i++) if (g[i][m+1]) return 0;
return 1LL<<(m+1-row);
}

int main()
{
int cas=0,t,i,j,k,q;
scanf("%d",&t);
while (t--)
{
printf("Case %d:\n",++cas);
memset(a,0,sizeof(a));
scanf("%d %d",&n,&m);
for (i=1;i<=m;i++)
{
scanf("%d",&k);
for (j=1;j<=k;j++) scanf("%d",&q),a[q][i]=1;
}
scanf("%d",&q);
while (q--)
{
for (i=1;i<=n;i++) scanf("%d",&g[i][m+1]);
for (i=1;i<=n;i++) for (j=1;j<=m;j++) g[i][j]=a[i][j];
printf("%I64d\n",gauss());
}
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: