#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int a[3][4]={-2,0,1,2,3,4,5,6,7,8,9,-2};
bool is(){
for(int i = 0;i<3;++i)
for(int j =0;j<4;++j){
int n =a[i][j];
if(i-1>=0 )
if(abs(a[i-1][j]-n)==1)
return false;
if(i-1>=0 &&j-1>=0)
if(abs(a[i-1][j-1]-n)==1)
return false;
if(j-1>=0)
if(abs(a[i][j-1]-n)==1)
return false;
if(i-1>=0 && j+1<4 )
if(abs(a[i-1][j+1]-n)==1)
return false;
if(j+1<4 )
if(abs(a[i][j+1]-n)==1)
return false;
if(i+1<3 && j+1<4 )
if(abs(a[i+1][j+1]-n)==1)
return false;
if(i+1<3 )
if(abs(a[i+1][j]-n)==1)
return false;
if(i+1<3 &&j-1>=0)
if(abs(a[i+1][j-1]-n)==1)
return false;
}
return true;
}
int main()
{
int num = 0;
do{
if(is())
++num;
}
while(next_permutation(*a+1,*a+11));
cout<<num;
return 0;
}
这里牵涉到二维数组指针的问题,二维数组名是一个指向一维数组的指针,如果不取地址,直接a+11,那么其实就是越界访问。
所以应该这样 while(next_permutation(*a+1,*a+11));