P6458 [COCI2006-2007#5] LIGA
题目链接:这里
思路
首先以string类型输入,然后判断是不是问号来储存为int类型,之后就可以想怎么求出?位置的数了
一开始的想法就是直接列举所有的情况,然后发现才得20分(挺高的)
然后就发现了原来用胜利的场数,平局的场数和输的场数就可以把所有数据都表示出来,哦搜嘎,然后就发现可以直接枚举这些数然后判断合不合法就好了,我真是个小**
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n;
int a[10],ans[N][10];
void solve(int x){
for (int i=0;i<=100;i++){
for (int j=0;j<=100-i;j++){
for (int k=0;k<=100-i-j;k++){
if ((a[1]==-1||a[1]==i+j+k)&&(a[2]==-1||a[2]==i)&&(a[3]==-1||a[3]==j)&&(a[4]==-1||a[4]==k)&&(a[5]==-1||a[5]==3*i+j)){
ans[x][1]=i+j+k,ans[x][2]=i,ans[x][3]=j,ans[x][4]=k,ans[x][5]=3*i+j;
}
}
}
}
}
int main(){
cin>>n;
for (int i=1;i<=n;i++){
string all,win,pea,los,sco;
int aa=-1,b=-1,c=-1,d=-1,e=-1;
cin>>all>>win>>pea>>los>>sco;
if (all[0]!='?'){
aa=0;
for (int i=0;i<all.size();i++){
aa=aa*10+all[i]-'0';
}
}
if (win[0]!='?'){
b=0;
for (int i=0;i<win.size();i++){
b=b*10+win[i]-'0';
}
}
if (pea[0]!='?'){
c=0;
for (int i=0;i<pea.size();i++){
c=c*10+pea[i]-'0';
}
}
if (los[0]!='?'){
d=0;
for (int i=0;i<los.size();i++){
d=d*10+los[i]-'0';
}
}
if (sco[0]!='?'){
e=0;
for (int i=0;i<sco.size();i++){
e=e*10+sco[i]-'0';
}
}
a[1]=aa,a[2]=b,a[3]=c,a[4]=d,a[5]=e;
solve(i);
}
for (int i=1;i<=n;i++){
for (int j=1;j<=5;j++){
cout<<ans[i][j]<<" ";
}
cout<<"\n";
}
return 0;
}