Problem 长度为素数的路径个数 pascal 和 C++ 的AC答案
—题目来源A
Problem : 长度为素数的路径个数
Time Limit: 1 Sec Memory Limit: 128 MB
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
—题目来源B
求长度为素数的路径个数
对于正整数n(3≤n≤13),可以画出n阶的回形矩阵。 下面画出的分别是3阶的,4阶的和7阶的回形矩阵:
对于n阶回形矩阵,从左上角出发,每步可以向右或向下走一格,走2*n-2步,可以到达右下角。
我们把这样的路径上所有格子中的数值之和,叫做该路径的长度。
本题要求,对于给出n值,求出n阶回形矩阵有多少路径的长度为素数? 如n=3时,路径及长度有:
因此说,3阶回形矩阵有2条路径的长度为素数。
Input
一个自然数n (3≤n≤13,不必判错)。
Output
一个正整数,即n阶回形矩阵中长度为素数的路径的个数。
Sample Input
3
Sample Output 2
Source
江苏省青少年信息学奥林匹克竞赛(JSOI2004)小学组复赛
pascal答案
program ex1279;
const di:array[1..2] of integer=(0,1); dj:array[1..2] of integer=(1,0); var n,i,j,k:integer;t,s:longint; a:array[0..14,0..14] of boolean; b:array[1..13,1..13] of integer; function pd(t:longint):boolean; var i:integer; begin
pd:=true;
if t=1 then pd:=false;
for i:=2 to trunc(sqrt(t)) do
if t mod i=0 then begin pd:=false;break;end; end;
procedure work(h,l,t:integer) ; var i,wi,wj:integer; begin
if (h=n) and (l=n) and (pd(t)) then begin inc(s);exit;end; for i:=1 to 2 do begin
wi:=h+di[i]; wj:=l+dj[i]; if a[wi,wj]=true then begin
a[wi,wj]:=false;
work(wi,wj,t+b[wi,wj]); a[wi,wj]:=true; end;
end; end; begin
readln(n);s:=0;
fillchar(a,sizeof(a),false); for i:=1 to n do for j:=1 to n do a[i,j]:=true; for i:=1 to n do
for j:=i to n-i+1 do for k:=i to n-i+1 do b[j,k]:=i;
work(1,1,1); writeln(s); end.
c++答案:
(这是我从pascal答案中进行大量修改后得到的,请不要随意转载)
#include<bits/stdc++.h>
using namespace std;
const int di[3] {0,0,1},dj[3] {0,1,0};
int n,i,j,k,t,s;
bool a[14][14];
int b[13][13];
bool pd(int t) {
if(t==1) return false;
for(int i=2; i*i<=t; i++) {
if(t%i==0) {
return false;
}
}
return true;
}
void work(int h,int l,int t) {
int i,wi,wj;
if (h==n&&l==n&&pd(t)) {
s++;
return;
}
for(i=1; i<=2; i++) {
wi=h+di[i];
wj=l+dj[i];
if(a[wi][wj]==true) {
a[wi][wj]=false;
work(wi,wj,t+b[wi][wj]);
a[wi][wj]=true;
}
}
}
int main() {
cin>>n;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
a[i][j]=true;
for(i=1; i<=n; i++)
for(j=i; j<=n-i+1; j++)
for(k=i; k<=n-i+1; k++)
b[j][k]=i;
work(1,1,1);
cout<<s;
}