题意:(直接看的BC上的中文题,其实说实话,这个是不好的,希望大家不要这样。)就是让你把5个输入的数编程同花顺的最小步数。其中牌只有4中花色,用A、B、C、D表示,然后值用1-13表示。
特殊的:A10、A11、A12、A13、A1也是同花顺。
其实说到底还是自己不够仔细。代码也太弱,这个题很简单想到的就是暴力解法,但是自己写的太复杂,很容易错。写这个题是为了让自己看看差距,同一个题,消耗的时间和别人不成对比。
自己的:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
char c;
int d;
} e[10];
int cnt[190];
int data[190][10];
char s[10];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(data,0,sizeof(data));
for(int i=0; i<=100; i++)
{
cnt[i]=0;
}
int id=0;
for(int i=0; i<5; i++)
{
getchar();
scanf("%c%d",&e[i].c,&e[i].d);
if(cnt[e[i].c]==0)
{
s[id++]=e[i].c;
}
cnt[e[i].c]++;
data[e[i].c][cnt[e[i].c]-1]=e[i].d;
}
//cout<<id<<endl;
int mm=5;
for(int i=0; i<id; i++)
{
int st[105];
for(int j=0; j<cnt[s[i]]; j++)
{
st[j]=data[s[i]][j];
}
// for(int j=0;j<cnt[s[i]];j++)
// printf("%d\n",st[j]);
sort(st,st+cnt[s[i]]);
//cout<<cnt[s[i]]<<endl;
//int ma=0;
for(int j=0; j<cnt[s[i]]; j++)
{
int mi=st[j];
int flag=0;
int ff=0;
for(int k=0; k<cnt[s[i]]; k++)
{
// int x=mi+4;
// int y=mi-4;
// if((x>=st[k]||y<=st[k])&&k!=j)
// {
// flag++;
// }
if(mi==10)
{
if(st[k]==12||st[k]==13||st[k]==11||st[k]==1)
flag++;
}
else if(mi==9)
{
if(st[k]==10||st[k]==11||st[k]==12||st[k]==13)
flag++;
}
else if(mi==8)
{
if(st[k]==9||st[k]==10||st[k]==11||st[k]==12)
flag++;
}
else if(mi==7)
{
if(st[k]==8||st[k]==9||st[k]==11||st[k]==10)
flag++;
}
else if(mi==6)
{
if(st[k]==8||st[k]==9||st[k]==7||st[k]==10)
flag++;
}
else if(mi==5)
{
if(st[k]==8||st[k]==7||st[k]==6||st[k]==9)
flag++;
}
else if(mi==4)
{
if(st[k]==5||st[k]==6||st[k]==7||st[k]==8)
flag++;
}
else if(mi==3)
{
if(st[k]==4||st[k]==5||st[k]==6||st[k]==7)
flag++;
}
else if(mi==2)
{
if(st[k]==4||st[k]==5||st[k]==6||st[k]==3)
flag++;
}
else if(mi==1)
{
if(st[k]==2||st[k]==4||st[k]==5||st[k]==3)
flag++;
}
}
//printf("flag=%d\n",flag);
mm=min(4-flag,mm);
flag=0;
for(int k=0; k<cnt[s[i]]; k++)
{
if(mi==1)
{
if(st[k]==13||st[k]==12||st[k]==11||st[k]==10)
flag++;
}
else if(mi==5)
{
if(st[k]==2||st[k]==3||st[k]==1||st[k]==4)
flag++;
}
else if(mi==6)
{
if(st[k]==2||st[k]==3||st[k]==5||st[k]==4)
flag++;
}
else if(mi==7)
{
if(st[k]==6||st[k]==3||st[k]==5||st[k]==4)
flag++;
}
else if(mi==8)
{
if(st[k]==6||st[k]==7||st[k]==5||st[k]==4)
flag++;
}
else if(mi==9)
{
if(st[k]==6||st[k]==7||st[k]==5||st[k]==8)
flag++;
}
else if(mi==10)
{
if(st[k]==6||st[k]==7||st[k]==9||st[k]==8)
flag++;
}
else if(mi==11)
{
if(st[k]==10||st[k]==7||st[k]==9||st[k]==8)
flag++;
}
else if(mi==12)
{
if(st[k]==10||st[k]==11||st[k]==9||st[k]==8)
flag++;
}
else if(mi==13)
{
if(st[k]==11||st[k]==12||st[k]==10||st[k]==9)
flag++;
}
}
mm=min(4-flag,mm);
}
}
printf("%d\n",mm);
}
}
上面是自己写的,枚举出所有的情况,中间还出错了几次,我都要崩溃咯。
看看别人的:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[20],b[20],sa[20],sb[20];
void work()
{
int ans = 5;
for(int i = 'A'; i <='D'; i++)
{
for(int j = 1; j <= 10; j++)
{
for(int k = 1; k <= 5; k++)
{
sa[k] =i;
sb[k] =j+k-1;
if(sb[k]==14)
sb[k]=1;
}
int res = 5;
for(int k = 1; k <= 5; k++)
{
for(int l = 1; l <= 5; l++)
{
if(a[k] == sa[l] && b[k] == sb[l])
res--;
}
}
if(res < ans)
ans = res;
}
}
printf("%d\n",ans);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
for(int i = 1; i <= 5; i++)
{
scanf(" %c%d",&a[i],&b[i]);
}
work();
}
return 0;
}
其实在很多时候,觉得自己可以放松的时候,就可以想想别人是多么的优秀,自己要走的路还长。大家一起借鉴,大家一起加油。