rt。这是我的代码:
#include<bits/stdc++.h>
using namespace std;
const int dx[]={0,-1,0,1},dy[]={-1,0,1,0};
char mp[102][102];
int n,m,ans=0,M[102][102],f[102][102][4];
bool vis[102][102];
void dfs(int x,int y,int mr,int t){
if(t<=3&&f[x][y][t]<=mr) return;
if(t<=3)f[x][y][t]=mr;
if(mp[x][y]=='C'){
ans=min(ans,mr);
return;
}
if(t<=3){
int nx=x+dx[t],ny=y+dy[t];
if(nx>=0&&ny>=0&&nx<n&&ny<m&&!vis[nx][ny]&&mp[nx][ny]!='*') {
vis[nx][ny]=1;
dfs(nx, ny,mr,t);
vis[nx][ny]=0;
}
}
for(int k=0; k<4; k++) {
if(k ==t) continue;
int nx = x+dx[k],ny = y+dy[k];
if(nx>=0&&ny>=0&&nx<n&&ny<m) {
if(!vis[nx][ny]&&mp[nx][ny]!='*'){
vis[nx][ny]=1;
dfs(nx,ny,mr+(t<=3),k);
vis[nx][ny]=0;
}
}
}
}
int main(){
cin>>m>>n;
memset(f, 127, sizeof(f));
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
cin>>mp[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]=='C'){
vis[i][j]=1;
mp[i][j]='*';
dfs(i,j,0,4);
cout<<ans;
return 0;
}
}
}
}
这是 @hongzy 的题解:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};
int n, m, ans(199), f[502][502][4];
char a[502][502];
bool vis[501][501];
void dfs(int i, int j, int c, int d) { //c为转弯次数,d为方向
if(d != -1 && f[i][j][d] <= c) return; //记忆化取最优解
if(d != -1) f[i][j][d] = c; //记录最优解
if(a[i][j] == 'C') {
if(ans > c) ans = c;
return;
}
int nx, ny;
if(d != -1) { //同方向搜索
nx = i + dx[d], ny = j + dy[d];
if(nx >= 1 && ny >= 1 && nx <= n && ny <= m && !vis[nx][ny] && a[nx][ny] != '*') {
vis[nx][ny] = true;
dfs(nx, ny, c, d);
vis[nx][ny] = false;
}
}
for(int k=0; k<4; k++) { //异方向搜索
if(k == d) continue;
nx = i + dx[k], ny = j + dy[k];
if(nx >= 1 && ny >= 1 && nx <= n && ny <= m) {
if(vis[nx][ny] || a[nx][ny] == '*') continue;
vis[nx][ny] = true;
dfs(nx, ny, c + (d != -1), k);
vis[nx][ny] = false;
}
}
}
int main() {
scanf("%d %d\n", &m, &n);
memset(f, 127, sizeof f); //f初始值INF
for(int i=1; i<=n; i++) gets(a[i] + 1);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++) {
if(a[i][j] != 'C') continue;
vis[i][j] = true;
a[i][j] = '*'; //以防被误认为是终点
dfs(i, j, 0, -1);
printf("%d\n", ans);
return 0;
}
return 0;
}
有区别吗?