题目描述
把前 n*n个素数从左上角开始按右、下、左、上、右、下、左、上……的顺序填入 n×n 的方阵就得到了蛇形素数方阵。以下是 n=4 和 n=5 的蛇形素数方阵:
给出 n,你的任务是求出 n×n 的蛇形素数方阵,并输出其中某个方格中的数值。
素数,又称质数,是指除 1 和其自身之外,没有其他约数的大于 1 的正整数。
输入格式
输入一行三个正整数 n,x,y。
输出格式
输出一行一个整数,表示 n×n 蛇形素数方阵第 x 行第 y 列中的数字。
输入输出样例
输入 #1
5 1 4
输出 #1
7
输入 #2
5 4 3
输出 #2
79
说明/提示
样例解释
参考上图 n=5。
数据规模
所有数据满足 1≤x,y≤n≤20。
本题原始满分为 15pts。
AC代码
(本题和蛇形填数差不多)
#include <bits/stdc++.h>
using namespace std;
int a[25][25],b[25];
bool pd(int v) //判断当前v是否为素数.
{
bool flag = 1;
for(int i=2;i<v;i++)
{
if(v%i == 0)
{
flag=0;
}
}
if(flag == 1) return 1;
return 0;
}
int main(){
int x=0,y=0,n,p,t=0,v=2,u=1,f,g;
cin>>n>>f>>g;
while(t<=n*n)
{
if(pd(v)==1)
{
t++;
b[t]=v;
}
v++;
}
p=n-1;
a[x][y]=b[u]; //先把1填好
while(1) //填方阵,其实没必要全填完.
{
for(int i=1;i<=p;i++) a[x][y++]=b[u++];
for(int i=1;i<=p;i++) a[x++][y]=b[u++];
for(int i=1;i<=p;i++) a[x][y--]=b[u++];
for(int i=1;i<=p-1;i++) a[x--][y]=b[u++];
a[x][y++]=b[u++];
p=p-2;
if(u>n*n) break;
}
f-=1;
g-=1; //因为a数组从0开始填,所以f和g分别要-1.
cout<<a[f][g]<<endl; //输出
return 0;
}
测试点信息