注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
思路: 这道题和皇后的问题很像,不同的就是有两个点是不能放的,那么我们可以直接从(0, 1)开始查找,以(2, 3)为结束条件
不懂得代码里有注释
答案是1580!!!!
代码:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #define INF -0x3f3f3f3f using namespace std; int map[20][20], visit[20]; int n = 3, m = 4, ans; ///在向方格里填数的时候我们只用考虑已经填过数的格子里的数是多少 ///就可以了,不用判断还未填数的格子 所以只用查找上面四个格子即可 int dr[4][2] = {0,-1,-1,0,-1,1,-1,-1}; bool check(int x, int y, int num) { for(int i = 0; i < 4; i++) { int nx = x + dr[i][0]; int ny = y + dr[i][1]; if(nx >=0&&nx < n&&ny >= 0&&ny < m) { if(map[nx][ny] == num - 1||map[nx][ny] == num + 1) return false; } } return true; } void dfs(int x, int y) ///行, 列 { if(x==2&&y==3) ///因为(2, 3)也是缺口,终止条件 { ans++; return; } if(y >= m) ///如果列数大于等于4, 那么就从下一行从头开始 { dfs(x + 1, 0); } else { for(int i = 0; i < 10; i++) { if(!visit[i]&&check(x, y, i)) ///判断下一个点是否用过 在判断是否越界 满足题目的条件 { visit[i] = 1; map[x][y] = i; dfs(x, y + 1); visit[i] = 0; map[x][y] = INF; } } } } int main() { for(int i = 0; i <= 5; i++) { for(int j = 0; j <= 5; j++) { map[i][j] = INF; } } memset(visit, 0, sizeof(visit)); ans = 0; dfs(0, 1);///因为(0,0)是缺口,所以从(0, 1)开始 cout << ans << endl; return 0; }
