解题思路:基本搜索,
注意事项:一定注意细节,字典序最小。
参考代码:
#include<bits/stdc++.h>
using namespace std;
const int N=20;
int dx[]={-1,-1,0,1,1,1,0,-1};//搜索常用,遍历八个方向
int dy[]={0,1,1,1,0,-1,-1,-1};
int k,n;
bool ac=false;//非常重要,用来解决字典需最小
vector<int> now,res;存下标,可以字符串,但是我用了一直出问题就很烦
int e[N][N];//地图
bool st[N][N];//记录是否走过
void dfs(int x,int y,int cnt){
if (ac) return ;
if (x == n && y == n && now.size() == (n * n - 1)) {//这里重点,找到一次就可以输出了
ac = true;
res = now;
return ;
}
int nxp = cnt % k;
for(int i=0;i<8;++i){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<1||nx>n||ny<1||ny>n||st[nx][ny]) continue;//不符合的条件出界和已经访问过
if(e[nx][ny]!=nxp) continue;//当前走的位置不符合地图上的数字
if(i==1&&st[x-1][y]==1&&st[x][y+1]==1) continue;
if(i==3&&st[x+1][y]==1&&st[x][y+1]==1) continue;
if(i==5&&st[x+1][y]==1&&st[x][y-1]==1) continue;
if(i==7&&st[x-1][y]==1&&st[x][y-1]==1) continue;
st[nx][ny]=true;//标记
now.push_back(i);放入
dfs(nx,ny,cnt+1);搜下一个
now.pop_back();不符合的放出
st[nx][ny]=false;回溯
}
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
cin>>e[i][j];
}
}
st[1][1]=true;//
dfs(1,1,1);
if(res.size()==0) cout<<-1<<endl;
else{
for(int i=0;i<res.size();++i) cout<<res[i];
cout<<endl;
}
return 0;
}
0.0分
2 人评分
HACK: 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
为什么找一次就可以输出的? 案例中也有两种途径阿
C语言训练-求矩阵的两对角线上的元素之和 (C语言代码)浏览:619 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:568 |
C语言训练-求PI* (C语言代码)浏览:639 |
WU-拆分位数 (C++代码)浏览:819 |
C语言程序设计教程(第三版)课后习题9.3 (C语言代码)浏览:650 |
剪刀石头布 (C语言代码)浏览:1519 |
WU-C语言程序设计教程(第三版)课后习题12.3 (C++代码)浏览:925 |
快速排序算法1浏览:996 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:518 |
小九九 (C语言代码)浏览:542 |