锦天帝


私信TA

用户名:dotcpp0729149

访问量:744

签 名:

等  级
排  名 40608
经  验 373
参赛次数 0
文章发表 3
年  龄 0
在职情况 学生
学  校 成都锦城学院
专  业

  自我简介:

TA的其他文章

解题思路:基本搜索,

注意事项:一定注意细节,字典序最小。

参考代码:

#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 人评分

  评论区

佬 能解释一下ac的作用吗
2024-05-16 21:59:02
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
2024-05-10 09:11:14
因为加了判断字典序长度过不了,会超时,你结合条件,只会有一条。(猜出来的)
2024-05-08 13:24:28
为什么找一次就可以输出的? 案例中也有两种途径阿
2024-05-07 17:36:26
  • «
  • 1
  • »