解题思路:
按顺序8个方向搜索,如果是下一个元素位置合法、并且下标是下一个数字,细节的点是可以取余来判断是否要重新置0,如果是斜边还要判断一下这条斜边对面那条边有没有被走过,如果都没问题就继续,符合条件直接退出 ,就是字典序最小的
具体斜边的判断就是,如果走斜边就在斜边数组里把两个点+1,check函数找到反斜边的两个点,如果两个都至少为1,那么返回true不访问。
注意事项:
还需要统计访问的点数,以便判断是否全部被访问,vis数组判断是否访问
参考代码:
#include <iostream> #include<vector> #include<algorithm> #include<string> #define LL long long int #define ll long long #define ull unsigned long long using namespace std; int n, m, k; int T, ncase = 0; const int N = 20 + 3; int a[N][N]; int vis[N][N]; string res; int xie[N][N]; int vs[8] = { -1,-1,0,1,1,1,0 ,-1}; int vt[8] = { 0,1,1,1,0,-1,-1,-1 }; bool check(int x, int y, int xx, int yy,int i) { if (i == 1 || i == 5) { int sx = min(x, xx); int sy = min(y, yy); int tx = max(x, xx); int ty = max(y, yy); if (xie[sx][sy] && xie[tx][ty])return true; } else { int sx = min(x, xx); int sy = max(y, yy); int tx = max(x, xx); int ty = min(y, yy); if (xie[sx][sy] && xie[tx][ty])return true; } return false; } void dfs(int x, int y,int id,int sum) { if (x==n-1&&y==n-1&&sum==n*n) { if (res.empty())cout << -1; for (char x : res) { cout << x; } exit(0); } for (int i = 0; i < 8; i++) { int xx = vs[i] + x; int yy = vt[i] + y; bool ok = false; if (xx>=0&&yy>=0&&xx<=n-1&&yy<=n-1&&!vis[xx][yy]&&a[xx][yy]==(id+1)%m) { if (i==1||i==3||i==5||i==7) { if (check(x, y, xx, yy,i))continue; xie[x][y] += 1; xie[xx][yy] += 1; ok = true; } res.push_back(i + '0'); vis[xx][yy] = 1; dfs(xx, yy,(id+1)%m,sum+1); vis[xx][yy] = 0; res.pop_back(); if (ok) { xie[x][y] -= 1; xie[xx][yy] -= 1; } } } } int main() { ios_base::sync_with_stdio(0); cin >> n>>m; for (int i = 0; i < n; i++) { for (int j = 0; j < n;j++)cin >> a[i][j]; } vis[0][0] = 1; if (a[0][0] != 0) { cout << -1; return 0; } dfs(0, 0,0,1); cout << -1; return 0; }
0.0分
2 人评分
hack: 10 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 和 10 2 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 都是 TLE
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:600 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:566 |
简单的a+b (C语言代码)浏览:752 |
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:1090 |
C语言训练-求1+2!+3!+...+N!的和 (C语言代码)万恶的long long浏览:906 |
【计算球体积】 (C语言代码)浏览:1158 |
DNA (C语言描述,蓝桥杯)浏览:1653 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:590 |
1126题解浏览:649 |
简单的a+b (C语言代码)浏览:618 |