注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
一开始直接用dfs八个方向进行搜索,结果很大,也不知道问题在哪里 最后直接一个方格一个方格的填,就出现了答案 先说一下思路吧, 对于每一个0-9的数进行标记,对于每一个坐标点进行填数 对填写的数进行判断如果可以直接填写,然后进行下一个dfs 如果不可以进行寻找合适的数字,找不到直接回溯到上一个dfs 答案:1580
#include <cstdio> #include <cstring> #include <cmath> int chess[8][8],sum=0;//sum代表方案的总数 bool vis[20]; int dx[8]={-1,-1,-1,0,0,1,1,1}; int dy[8]={-1,0,1,-1,1,-1,0,1}; bool check(int k,int x,int y)//对他相邻的8个方格进行比较 { int i,j; for(i=0;i<8;++i) { int ex = x + dx[i]; int ey = y + dy[i]; if(chess[ex][ey]!=-1&&(ex!=1||ey!=1)&&(ex!=3||ey!=4)&&ex>=1&&ex<4&&ey>0&&ey<5) { if(abs(chess[ex][ey]-k)==1) return false; } } return true; } void dfs(int sx,int sy)//sx,sy代表初始坐标 { for(int k=0;k<10;++k) { if(!vis[k]&&check(k,sx,sy)) { if(sx==3&&sy==3)//这个 是终点坐标,最后一个数没有必要进行标记 { //直接回溯就行了 ++sum; return ; } chess[sx][sy]=k; vis[k]=true; if(sy==4)//如果到达了,最后一列就进行下一行的填数 dfs(sx+1,1); else dfs(sx,sy+1); vis[k]=false; chess[sx][sy]=-1; } } } int main() { memset(chess,-1,sizeof(chess)); memset(vis,false,sizeof(vis)); dfs(1,2);//0代表已经填写了多少个数,1,2代表开始的坐标 printf("%d\n",sum); return 0; }