A.美丽的2
//美丽的2
//答案:563
#include
using namespace std;
int check(int x)
{
while(x)
{
if(x%10==2) return true;
x/=10;
}
return false;
}
int main()
{
int res=0;
for(int i=1;i<=2020;i++)
{
if(check(i)) res++;
}
cout<
B.扩散
//扩散
//BFS
//答案:20312088
#include
using namespace std;
typedef pair PII;
const int N=6300;
int g[N][N];
int dist[N][N];
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
int bfs()
{
memset(dist,-1,sizeof dist);
queueq;
q.push({0+2100,0+2100});
q.push({2020+2100,11+2100});
q.push({11+2100,14+2100});
q.push({2000+2100,2000+2100});
dist[2100][2100]=0;
dist[4120][2111]=0;
dist[2111][2114]=0;
dist[4100][4100]=0;
int cnt=0;
while(q.size())
{
auto t=q.front();
q.pop();
if(dist[t.first][t.second]==2021) break;
cnt++;
for(int i=0;i<4;i++)
{
int nx=dx[i]+t.first,ny=dy[i]+t.second;
if(dist[nx][ny]==-1)
{
q.push({nx,ny});
dist[nx][ny]=dist[t.first][t.second]+1;
}
}
}
return cnt;
}
int main()
{
cout<
C.阶乘约数
//阶乘约数
//N的约数个数=(cnt1+1)*(cnt2+1)*(cnt3+1)*.....*(cntk+1)
//cnt为N的所有质因数对应的出现次数
//因为,N=p1^cnt1+p2^cnt2+.......+pk^cntk
//答案:39001250856960000
#include
using namespace std;
const int N=110;
unordered_mapa;
int main()
{
int cnt=0;
//先求出所有的质因数以及对应的个数
for(int i=1;i<=100;i++)
{
int x=i;
for(int j=2;j<=x/j;j++)
{
while(x%j==0)
{
a[j]++;
x/=j;
}
}
if(x>1) a[x]++;
}
long long res=1;
for(auto t:a)
{
int val=t.first,cnt=t.second;
res=res*(cnt+1);
}
cout<
D.本质上升序列
//本质上升序列
//BFS
//答案: 3616159
#include
using namespace std;
typedef pairPSI;
string str="tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl";
queueq;//用队列维护字串及字串最后一个位置
unordered_mapst;//标记是否出现
int ans;//记录个数
int main()
{
//先把长度为1的字符串加入队列
for(int i=0;i<200;i++)
{
string s="";
s+=str[i];
if(!st[s])
{
st[s]=1;//标记
q.push({s,i});//加入队列
ans++;//合法序列+1
}
}
//再通过bfs,把长度大于1的字符串加入队列,进行筛选判断
while(q.size())
{
auto t=q.front();
q.pop();
string s=t.first;
int pos=t.second;
for(int i=pos+1;i<200;i++)
{
if(str[i]>str[pos]&&!st[s+str[i]])
{
st[s+str[i]]=1;//标记
q.push({s+str[i],i});//加入队列
ans++;//合法序列+1
}
}
}
cout<
E.玩具蛇
//玩具蛇
//DFS
//答案: 552
#include
using namespace std;
int ans;
int n=4;
int st[10][10];
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
void dfs(int x,int y,int u)
{
if(u==n*n)
{
ans++;
return ;
}
for(int i=0;i<4;i++)
{
int nx=dx[i]+x,ny=dy[i]+y;
if(!st[nx][ny]&&nx>=1&&nx<=n&&ny>=1&&ny<=n)
{
st[nx][ny]=1;
dfs(nx,ny,u+1);
st[nx][ny]=0;
}
}
}
int main()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
st[i][j]=1;
dfs(i,j,1);
st[i][j]=0;
}
}
cout<