Problem : 长度为素数的路径个数
Description
对于正整数n (3≤n<20),可以画出n阶的回形矩阵。下面画出的分别是3阶的,4阶的和7阶的回形矩阵:

对于n阶回形矩阵,从左上角出发,每步可以向右或向下走一格,走2* n-2步,可以到达右下角。我们把这样的路
径上所有格子中的数值之和,叫做该路径的长度。本题要求,对于给出n值,求出n阶回形矩阵有多少路径的长度为
素数?如n=3时,路径及长度有:

因此说,3阶回形矩阵有2条路径的长度为素数。
Input
一个自然数n (3≤n<20,不必判错)。
Output
一个正整数,即n阶回形矩阵中长度为素数的路径的个数。
Sample Input
3
Sample Output
2
HINT
#include<bits/stdc++.h>
using namespace std;
int n;
bool tot[1000][1000];
int ans,cnt[1000][1000];
const int dir[3]={0,0,1};//素数行走的方向
const int djr[3]={0,1,0};
bool cmp(int s){
for(int i=2;i*i<=s;i++){
if(s%i==0){
return false;
}
}
return true;
}//这是求素数的函数
void dfs(int x,int y,int c){
if(x==n&&y==n&&cmp(c)){
ans++;//符合条件就累积线路
return;
}
for(int i=1;i<=2;i++){
int tx=x+dir[i];
int ty=y+djr[i];
if(tot[tx][ty]){
tot[tx][ty]=0;
dfs(tx,ty,c+cnt[tx][ty]);//直接找路线
tot[tx][ty]=1;
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
tot[i][j]=1;
}
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n-i+1;j++){
for(int k=i;k<=n-i+1;k++){
cnt[j][k]=i;//n-i+1条路
}
}
}
dfs(1,1,1);
cout<<ans;
return 0;
}
2万+



被折叠的 条评论
为什么被折叠?



