在9(3*3)个方格的方阵中填入九个正整数,要求每两个上下左右相邻两数之和为质数,求vc++6.0程序
急!!!!!!!!!!!麻烦大家最好给个程序,谢谢了!!!哪位编程高手看到了给写个出来,兄弟十点半要交的,可是编不出来啊...
急!!!!!!!!!!!
麻烦大家最好给个程序,谢谢了!!!哪位编程高手看到了给写个出来,兄弟十点半要交的,可是编不出来啊 展开
麻烦大家最好给个程序,谢谢了!!!哪位编程高手看到了给写个出来,兄弟十点半要交的,可是编不出来啊 展开
展开全部
蛮力法
质数,最基本要是奇数,2除外
奇数加奇数等于偶数
偶数家偶数等于偶数
奇数加偶数等于奇数
也就是说上下左右的数一个是奇数,一个是偶数
蛮力发试试吧,也许会有更好的方法
质数,最基本要是奇数,2除外
奇数加奇数等于偶数
偶数家偶数等于偶数
奇数加偶数等于奇数
也就是说上下左右的数一个是奇数,一个是偶数
蛮力发试试吧,也许会有更好的方法
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include "stdio.h"
#define N 11/*设定可填入的整数个数*/
int pos;/*标示方格的序号*/
int a[9];/*用于存储方格所填入的整数*/
int b[N];/*用于存储整数是否填入方格的标志,若填入则该标志为0*/
int checkmatrix[][3]={{-1},{0,-1},{1,-1},{0,-1},{1,3,-1},{2,4,-1},{3,-1},{4,6,-1},{5,7,-1}};
/*存储需要需要检查合理性的相邻方格的序号,-1拦截以结束检查*/
void write(int a[])/*打印一组解*/
{ int i,j;
printf("------------------\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%3d",a[3*i+j]);
}
printf("\n");
}
printf("------------------\n");
}
int isprime(int m)/*判断一个数是否是素数*/
{
int i;
int primes[]={2,3,5,7,11,17,19,23,29,-1};
if(m==1||m%2==0) return 0; /*若为1或偶数则排除*/
for(i=0;primes[i]>0;i++)
if(m==primes[i]) return 1; /*若为列表中素数则确认*/
for(i=3;i*i<=m;i+=2)if(m%i==0)return 0; /*寻找m的因数,若有因数则排除*/
return 1;
}
int selectnum(int start)/*从小到大查找还未填入方格中的整数,若无返回0*/
{
int j;
for(j=start;j<N;j++)if(b[j])return j;
return 0;
}
int check(int pos)/*检查填入POS位置的整数是否合理*/
{int i,j;
for(i=0;(j=checkmatrix[pos][i])>=0;i++)/*查找检验合理性数组中对应行存放的相邻方格的序号*/
if(!isprime(a[pos]+a[j]))return 0;/*检验相邻方格的序号是否为素数*/
return 1;
}
int extend(int pos)/*为下一个方格找一个尚未使用过的整数*/
{a[++pos]=selectnum(1);
b[a[pos]]=0;/*置标志位为0,该数已填入*/
return pos;
}
int change(int pos)/*调整当前方格填入的整数,使其合理,若找不到则回溯*/
{
int j;
while(pos>=0 && (j=selectnum(a[pos]+1))==0)b[a[pos--]]=1;/*若找不到则后退到前一方格,并清除当前方格整数的填入标志*/
if(pos<0)return -1;/*若第一个方格也找不到则返回-1,表明已回溯完毕*/
b[a[pos]]=1;/*恢复已填入但不合理的整数*/
a[pos]=j;/*填入下一个试探的数*/
b[j]=0;/*置该试探数的填入标志为0,表明填入*/
return pos;/*返回当前方格的序号*/
}
void find()/*寻找解主程序*/
{
int ok=1;
pos=0;a[pos]=1;b[a[pos]]=0;/*初始化*/
do{
if(ok)
if(pos==8)/*表明已找到一组解*/
{write(a);/*打印这组解*/
pos=change(pos);/*回溯,寻找另一组解*/
}
else pos=extend(pos);/*填下一个方格*/
else pos=change(pos);/*调整当前所填整数*/
ok=check(pos);/*判断当前方格所填数是否合理,合理则OK为1*/
}while(pos>=0);/*回溯完毕则循环结束,程序亦结束*/
}
main()
{
int i;
for(i=1;i<N;i++)
b[i]=1;/*所有整数的填入标志初始化*/
find();
}
#define N 11/*设定可填入的整数个数*/
int pos;/*标示方格的序号*/
int a[9];/*用于存储方格所填入的整数*/
int b[N];/*用于存储整数是否填入方格的标志,若填入则该标志为0*/
int checkmatrix[][3]={{-1},{0,-1},{1,-1},{0,-1},{1,3,-1},{2,4,-1},{3,-1},{4,6,-1},{5,7,-1}};
/*存储需要需要检查合理性的相邻方格的序号,-1拦截以结束检查*/
void write(int a[])/*打印一组解*/
{ int i,j;
printf("------------------\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%3d",a[3*i+j]);
}
printf("\n");
}
printf("------------------\n");
}
int isprime(int m)/*判断一个数是否是素数*/
{
int i;
int primes[]={2,3,5,7,11,17,19,23,29,-1};
if(m==1||m%2==0) return 0; /*若为1或偶数则排除*/
for(i=0;primes[i]>0;i++)
if(m==primes[i]) return 1; /*若为列表中素数则确认*/
for(i=3;i*i<=m;i+=2)if(m%i==0)return 0; /*寻找m的因数,若有因数则排除*/
return 1;
}
int selectnum(int start)/*从小到大查找还未填入方格中的整数,若无返回0*/
{
int j;
for(j=start;j<N;j++)if(b[j])return j;
return 0;
}
int check(int pos)/*检查填入POS位置的整数是否合理*/
{int i,j;
for(i=0;(j=checkmatrix[pos][i])>=0;i++)/*查找检验合理性数组中对应行存放的相邻方格的序号*/
if(!isprime(a[pos]+a[j]))return 0;/*检验相邻方格的序号是否为素数*/
return 1;
}
int extend(int pos)/*为下一个方格找一个尚未使用过的整数*/
{a[++pos]=selectnum(1);
b[a[pos]]=0;/*置标志位为0,该数已填入*/
return pos;
}
int change(int pos)/*调整当前方格填入的整数,使其合理,若找不到则回溯*/
{
int j;
while(pos>=0 && (j=selectnum(a[pos]+1))==0)b[a[pos--]]=1;/*若找不到则后退到前一方格,并清除当前方格整数的填入标志*/
if(pos<0)return -1;/*若第一个方格也找不到则返回-1,表明已回溯完毕*/
b[a[pos]]=1;/*恢复已填入但不合理的整数*/
a[pos]=j;/*填入下一个试探的数*/
b[j]=0;/*置该试探数的填入标志为0,表明填入*/
return pos;/*返回当前方格的序号*/
}
void find()/*寻找解主程序*/
{
int ok=1;
pos=0;a[pos]=1;b[a[pos]]=0;/*初始化*/
do{
if(ok)
if(pos==8)/*表明已找到一组解*/
{write(a);/*打印这组解*/
pos=change(pos);/*回溯,寻找另一组解*/
}
else pos=extend(pos);/*填下一个方格*/
else pos=change(pos);/*调整当前所填整数*/
ok=check(pos);/*判断当前方格所填数是否合理,合理则OK为1*/
}while(pos>=0);/*回溯完毕则循环结束,程序亦结束*/
}
main()
{
int i;
for(i=1;i<N;i++)
b[i]=1;/*所有整数的填入标志初始化*/
find();
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询