C语言算法问题,求救于各位大侠
不知道有没有兄弟问过相同的问题噢
先说说吧:
在一个N*N的棋盘上填入1、2、3、4....N*N个数,要求相邻两数(左右、上下)之和为素数,如何实现?
实在是没有一点思路,请各位帮忙想想。
[解决办法]
这个问题好像是不能实现吧,刚才大体看了一下好像3*3的就没有解决的方案,你确定这个问题是对的吗??
要想实现你的问题首先最基本的要求就是奇数和奇数偶数和偶数不能相邻,3*3的话1~9有5个奇数,这就要求这5个奇数必须是成X形排列,其余四个位置是偶数,那么棋盘的最中心位置必须是奇数,同时中心位置的数还必须满足能同时和上下以及左右的四个数相和必须是素数,而1.3.5.7.9这5个数中好像没有能同时和2.4.6.8相加都是素数的吧。
所以如果不是我把问题理解错了就是这个问题根本没有答案。
[解决办法]
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
#include <math.h>
void fn(vector <int> ,long int,long int);
void check(vector <int> );
void main()
{
int n=0;
cout < < "请输入排列的数字总个数 " < <endl;
cin> > n;
if(n <=0)
return;
vector <int> vec;
fn(vec,n*n,0);
}
void fn(vector <int> vec,long int num,long int count)
{
int key=0;//0,1是用来判断数字是否重复
count++;
for(int i=1;i <=num;i++)
{
for(int j=1;j <count;j++)
{
key=0;
if(vec[j-1]==i)
{
key=1;
break;
}
}
if(key==0)
{
vec.push_back(i);
if(count <num)
{
fn(vec,num,count);
}
if(count==num)
{
check(vec);
}
vec.pop_back();//每次返回后将容器最后一个元素删除
}
}
}
void check(vector <int> check_vec)
{
long int len=check_vec.size();
long sqrt_len=sqrt(len);
long standard=0,all=0,row=0,line=0;
int a=0,b=0;
for(a=0;a <sqrt_len;a++)
standard+=check_vec[a];//以第一行的和为标准
a=0;
for(a=0;a <sqrt_len;a++)
{
line=0,row=0;
for(b=0;b <sqrt_len;b++)
{
line+=check_vec[a*sqrt_len+b];//验证行
row+=check_vec[a+b*sqrt_len];//验证列
}
if(row!=standard||line!=standard)
return;
}
a=0,b=0;
for(;a <sqrt_len;a++,b++)
all+=check_vec[a*sqrt_len+b];//主对角线
if(all!=standard)
return;
a=sqrt_len-1,b=0,all=0;
for(;b <sqrt_len;a--,b++)//反主对角线
all+=check_vec[a*sqrt_len+b];
if(all!=standard)
return;
for(a=0;a <len;a++)
{
cout < <setw(2) < <check_vec[a] < < ", ";
if((a+1)%sqrt_len==0)
cout < <endl;
}
cout < <endl;
}
[解决办法]
排列 穷举 只写了排列
#include <iostream>
using namespace std;
int used[100]={0}; int a[10][10];visit[10][10]={0};
bool isprime(int num)
{
for(int i=2;i <=sqrt(num);i++)
if(num%i==0) return false;
return true;
}
void check();
void pailie(int x,int y)
{
if(x==10)
{ if(check(a){
for(int m=0;m <10;m++)
{
for(int n=0;n <10;n++)
cout < <a[m][n] < < " ";
cout < <endl;
}
cout < <endl;
}
return;
}
for(int i=1;i <=100;i++)
{
if(used[i-1]==0)
{
used[i-1]=1;
a[x][y]=i;
if(x <=9)
{
if(y <9)
{
pailie(x,y+1);
used[i-1]=0;
}
else
{
pailie(x+1,0);
used[i-1]=0;
}
}
}
}
}
void main()
{
for(int m=0;m <10;m++)
for(int n=0;n <10;n++)
a[m][n]=0;
pailie(0,0);
}