Problem 长度为素数的路径个数 pascal 和 C++ 的AC答案

探讨了在特定阶数的回形矩阵中,寻找路径长度为素数的问题。矩阵由正整数构成,从左上角出发,每步可向右或向下移动,目标是计算到达右下角且路径总和为素数的路径数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值