闲谈:这题太***了,我就不解释了.先试了发迭代加深,主要是测试自己会搜不,我也知道会t..)
这是迭代加深的代码:
#include <bits//stdc++.h> using namespace std; typedef pair<int,int> pi; const int N=200; char an[N][N]; int dx[8]={-2,-1,-2,-1,2,2,1,1}; int dy[8]={1,2,-1,-2,1,-1,-2,2}; int n,m; bool ck(int x,int y) { if(x<0||x>n||y<0||y>m||an[x][y]=='*') return false; return true; } bool dfs(int dep,pi start,pi end) { if(start==end) return true; if(dep==0) return false; for(int i=0;i<8;i++) { int ix=start.first+dx[i];int iy=start.second+dy[i]; if(ck(ix,iy)) { pi temp={ix,iy}; if(dfs(dep-1,temp,end)) return true; } } return false; } int main() { pi start,end; cin>>m>>n;//m列n行. for(int i=0;i<n;i++) cin>>an[i]; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(an[i][j]=='K') start={i,j}; else if(an[i][j]=='H') end={i,j}; } } int depth=0; while(!dfs(depth,start,end)) depth++; cout<<depth<<endl; return 0; }
这是bfs代码:
#include <bits//stdc++.h> using namespace std; typedef pair<int,int> pi; const int N=200; char an[N][N]; int dis[N][N]; int dx[8]={-2,-1,-2,-1,2,2,1,1}; int dy[8]={1,2,-1,-2,1,-1,-2,2}; int n,m; int st[N][N]; pi start,ed; bool ck(int x,int y) { if(x<0||x>n||y<0||y>m||an[x][y]=='*') return false; return true; } int bfs() { memset(dis,0x3f,sizeof dis); queue<pi>q; q.push(start); dis[start.first][start.second]=0; while(q.size()) { pi temp=q.front(); st[temp.first][temp.second]=true; q.pop(); if(temp==ed) return dis[ed.first][ed.second]; for(int i=0;i<8;i++) { int ix=temp.first+dx[i]; int iy=temp.second+dy[i]; if(st[ix][iy]) continue; if(ck(ix,iy)) { if(dis[temp.first][temp.second]+1<dis[ix][iy]) { dis[ix][iy]=dis[temp.first][temp.second]+1; q.push({ix,iy}); } } } } } int main() { cin>>m>>n;//m列n行. for(int i=0;i<n;i++) cin>>an[i]; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(an[i][j]=='K') start={i,j}; else if(an[i][j]=='H') ed={i,j}; } } cout<<bfs()<<endl; return 0; }