马走 “日”
给你一个8*8的棋盘,从一个起点开始,按日字形走(如果行移动两格,列移动1格,如果列移动两格,行移动1格),走满整个棋盘,每个点只能走一遍,输出一个可行路径
一、dfs输出所有路径
一开始以为如果能走满整个棋盘,那么从任意起点开始搜索都能搜出答案,结果是错的,只能从一个特定的入口开始才能走完整个期盘
然后因为没有确定起点和终点,要走完整个棋盘,很慢很慢,即使是6x6的棋盘,虽然能走满整个棋盘,但是也要很久
#include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<list> #define ll long long using namespace std; int a[8][8]; int dir[8][2] = { {2,1},{-2,-1},{-2,1},{2,-1},{1,2},{1,-2},{-1,2},{-1,-2} }; struct node { int x; int y; }p[10000]; bool flag = false; int ans = 0; void dfs(int x, int y, int cnt) { if (cnt >= 36) { cout << "------------------------------" << endl; for (int i = 0; i < 36; i++) { cout << p[i].x << " " << p[i].y << endl; } ans++; flag = true; return; } for (int i = 0; i < 8; i++) { int dx = x + dir[i][0]; int dy = y + dir[i][1]; if (a[dx][dy] == 0 && dx >= 0 && dx < 6 && dy >= 0 && dy < 6) { a[dx][dy] = 1; p[cnt].x = dx; p[cnt].y = dy; dfs(dx, dy, cnt + 1); a[dx][dy] = 0; } } } int main() { for (int i = 0; i < 6; i++) { for (int j = 0; j < 6; j++) { memset(a, 0, sizeof(a)); a[i][j] = 1; p[0].x = i; p[0].y = j; dfs(i, j, 1); if (flag) break; } if (flag) break; } /*bool flag=dfs(0, 0, 1);*/ cout << flag << " ans=" << ans << endl; return 0; }
等风起的那一天,我已准备好一切