题目描述
农夫拥有n头有斑点的奶牛和n头没有斑点的奶牛。由于她刚刚完成了关于牛的基因的一门课程,所以她相信,她的奶牛身上的斑点是由于奶牛基因组上单个位置的基因突变引起的。农夫花费了巨大的代价,把她的奶牛的基因组进行了排序。每一个基因组都是一个由ACGT四个字母组成的长度为m的字符串。当她排列她的牛的基因组时,她得到了以下的表格,(此时n=3)
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | … | M |
有斑点的牛 1 | A | A | T | C | C | C | A | … | T |
有斑点的牛 2 | G | A | T | T | G | C | A | … | A |
有斑点的牛 3 | G | G | T | C | G | C | A | … | A |
无斑点的牛 1 | A | C | T | C | C | C | A | … | G |
无斑点的牛 2 | A | C | T | C | G | C | A | … | T |
无斑点的牛 3 | A | C | T | T | C | C | A | … | T |
仔细观察这张表,她推测,位置2是基因组中可能解释斑点的潜在位置。也就是说,通过查看这张表,农夫可以预测她的哪头奶牛是有斑点的,哪些不是(这里,A或G意味着斑点,C意味着无斑点; T是无关紧要的,因为它不会出现在任何奶牛的位置2)。位置1本身不足以解释斑点,因为这个位置的A可能表明一头斑点的牛或一头无斑点牛。
给出农民的奶牛的基因组,请计算潜在解释斑点的数目。
输入输出格式
输入格式(文件名 cownomics.in):
输入数据第一行包含两个小于100的正整数N和M。下一行至第N+1行每行包含一串长为M的字符串,表示斑点牛的基因组。第N+2行至最后每行同样包含一串长为M的字符串,表示普通奶牛的基因组。
输出格式(文件名 cownomics.out):
请计算在基因组中可能导致斑点病的位置的数量(一个大于等于0,小于等于M的整数)。
样例输入输出
样本输入
3 8
AATCCCAT
GATTGCAA
GGTCGCAA
ACTCCCAG
ACTCGCAT
ACTTCCAT
样本输出
1
这道字符串题又坑了我好久。我的输入到现在都没弄清楚,我本来很开心地scanf字符数组,结果一直发现有问题,原来是我没有输入换行符,太坑了,太坑了。我调试了大半个小时。结果才发现是输入错了。
#include<bits/stdc++.h>
using namespace std;
int n,m,s=0;
char a[110][110],b[110][110];
string tmp;
int main()
{
freopen("cownomics.in","r",stdin);
freopen("cownomics.out","w",stdout);
scanf("%d%d",&n,&m);
getline(cin,tmp);
for (int i=1;i<=n;++i)
{
for (int j=1;j<=m;++j)
scanf("%c",&a[i][j]);
getline(cin,tmp);
}
for (int i=1;i<=n;++i)
{
for (int j=1;j<=m;++j)
scanf("%c",&b[i][j]);
getline(cin,tmp);
}
for (int i=1;i<=m;++i)
{
bool c[5]={},d[5]={},flag=true;
for (int j=1;j<=n;++j)
{
switch (a[j][i])
{
case 'A':c[1]=true;break;
case 'T':c[2]=true;break;
case 'G':c[3]=true;break;
case 'C':c[4]=true;break;
}
switch (b[j][i])
{
case 'A':d[1]=true;break;
case 'T':d[2]=true;break;
case 'G':d[3]=true;break;
case 'C':d[4]=true;break;
}
}
for (int j=1;j<=4;++j)
if (c[j]&&d[j]) flag=false;
if (flag) s++;
}
cout<<s<<endl;
return 0;
}
你通过观察那张表格,就大概可以知道这道题的方法。仔细观察位置2,有斑点的牛基因有AG,无斑点的牛基因只有C,所以说如果有一个位置,有斑点的牛和无斑点的牛,它们的基因没有重复,那个这个位置就算。
所以,我用一个c数组存储有斑点的牛中的ATGC是否出现过,用d数组存储无斑点的牛,然后,c数组和d数组一对一对进行比较。从宏观上来看,就是判断了一个位置上牛的基因有没有重复。如果没有重复,就算;一有重复就不算。