hdu2410(水)
阿新 • • 發佈:2017-07-10
問號 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(水)