1. 程式人生 > >hdu2410(水)

hdu2410(水)

問號 oid scanf bool space 一個數 tmp pan ios

題意

如果兩個數字除了帶問號的位以外都相同,我們稱這兩個數可以相互匹配

給你兩個數,其中第一個數字裏有一些問號,問有多少個大於第二個數的數字可以和第一個數字匹配

一開始懶得讀題,到網上搜題意,結果居然沒搜到這個題,於是決定貼一下代碼

從高位到低位for循環搞一搞就好了,當然也可以dfs

#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
#include
<map> #include<queue> using namespace std; typedef long long ll; const int MAX=1<<29; int n,m,len; char str[15]; char tmp[15]; ll digit[12]; ll nums[15],ans; void dfs(int pos,bool flag) { int i,j; if(pos==len) { if(!flag)ans++; return ; } if(str[pos]==
?) { if(!flag)ans+=digit[nums[pos]]; else { ans+=digit[nums[pos]-1]*(9-tmp[pos]); dfs(pos+1,flag); } } else { if(flag) { if(str[pos]<tmp[pos])return ; else if(str[pos]==tmp[pos])dfs(pos+1
,flag); else dfs(pos+1,0); } else dfs(pos+1,0); } } int main() { int i,j; digit[0]=1; for(i=1;i<12;i++)digit[i]=digit[i-1]*10; while(scanf("%s",str)!=EOF) { if(str[0]==#)return 0; scanf("%s",tmp); memset(nums,-1,sizeof(nums)); len=strlen(str); nums[len]=0; for(i=len-1;i>=0;i--) { nums[i]=nums[i+1]; if(str[i]==?)nums[i]++; } ans=0; dfs(0,1); printf("%lld\n",ans); } }

hdu2410(水)