问题描述
小蓝站在一个n行m列的方格图中间,方格图的每一个方格上都标有一个正整数如果两个相邻方格(上下左右四个方向相邻)内的数的最大公约数大于1,则可以从其中一个方格移动到另一个方格,当然也可以从另一个方格移回第一个方格。
假设小蓝开始时站在第”行第c列,请问小蓝可以移动到方格图内的多少个方格?
输入格式
输入的第一行包含两个整数 nm,用一个空格分隔,表示方格图的行数和列数接下来n行,每行包含m个正整数,相邻整数间用一个空格分隔,依次表示方格图中从第1行到第n行,每行从第1列到第m列中的数。
接下来一行包含两个整数r,c,用一个空格分隔,表示小蓝所在的行号和列号
例子:输入:3 4
7 8 9 10
12 6 4 3
2 7 8 9
1 1
输出:6
#include <stdio.h>
int n,m,j,i,x,y,sum=0;
int dp[100][100]={0},num[100][100];//dp数组用来标记已经算过的地方,以防止重复判断 ,num为原数组
int f(int a,int b){//判断两个数的最大公约数的函数被
int sum;
while(sum=a%b){
a=b;
b=sum;
}
return b;
}
int g(int i,int j){
if(dp[i][j]==1){//判断过的位置为一,用dp来记录
return 0;
}
dp[i][j]=1;//判断之后就标记为一
if(i+1<m&&f(num[i][j],num[i+1][j])>1){//下
g(i+1,j);
}
if(j-1>=0&&f(num[i][j],num[i][j-1])>1){//左
g(i,j-1);
} //这里进行四个方向分别判断,然后递归
if(j+1<n&&f(num[i][j],num[i][j+1])>1){//右
g(i,j+1);
}
if(i-1>=0&&f(num[i][j],num[i-1][j])>1){//上
g(i-1,j);
}
}
int main(){
scanf("%d%d",&m,&n);//数组的行和列
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",&num[i][j]);
}
}
printf("请输入起点\n");
scanf("%d%d",&x,&y);
g(x,y);
for(i=0;i<m;i++){
for(j=0;j<n;j++){//这里便利整个数组,找出所以判断过的地方
if(dp[i][j]==1){
sum++;
}
}
}
printf("%d",sum);
return 0;
}