找不同,玄2 关
查看原帖
找不同,玄2 关
764773
AstaVenti_楼主2024/5/25 14:17

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;
}

有区别吗?

2024/5/25 14:17
加载中...