萌新刚学记忆dfs,求教
查看原帖
萌新刚学记忆dfs,求教
390033
_caiji_楼主2021/1/31 15:37

55pts,没t,求改正

#include <cstdio>
#include <cstring>
namespace cjh{
	#define rep(i,l,r) for(int i=(l),end##i=(r);i<=end##i;i++)
	#define dwn(i,l,r) for(int i=(l),end##i=(r);i>=end##i;i--)
	#define ll long long
	#define ull unsigned long long
	#define mset(a,num) std::memset(a,num,sizeof(a))
	struct Math{
		template<class T> T abs(T _){return _<0?-_:_;}
		template<class T> T max(T _,T __){return _<__?__:_;}
		template<class T> T min(T _,T __){return _>__?__:_;}
		template<class T> void swap(T &_,T &__){T ___=_;_=__;__=___;}
		template<class T> T chkmax(T &_,T __){return _<__?(_=__,__):_;}
		template<class T> T chkmin(T &_,T __){return _>__?(_=__,__):_;}
	} mth;
}//头文件请无视
using cjh::mth;
using std::scanf;
using std::printf;
const int dx[5]={0,-1,0,0,1},
		  dy[5]={0,0,-1,1,0};
int n,m,a[110][110],ans=30000;
int rmb[110][110];
bool vis[110][110];
int dfs(int x,int y,bool hp){
	if(rmb[x][y]>-1) return rmb[x][y];
	if(x==n&&y==n) return rmb[x][y]=0;
	//printf("%d %d %d\n",x,y,rmb[x][y]);
	int ans=0x3f3f3f3f;
	rep(i,1,4){
		int tmpx=x+dx[i],tmpy=y+dy[i];
		if(tmpx<1||n<tmpx||tmpy<1||n<tmpy||vis[tmpx][tmpy]) continue;
		if(a[tmpx][tmpy]==0){
			if(hp){
				a[tmpx][tmpy]=a[x][y],vis[tmpx][tmpy]=1;//回溯并把下一格的的颜色改成这一格的
				mth.chkmin(ans,dfs(tmpx,tmpy,0)+2);
				a[tmpx][tmpy]=0,vis[tmpx][tmpy]=0;
			}
		}else{
			if(a[tmpx][tmpy]==a[x][y]){
				vis[tmpx][tmpy]=1;//回溯
				mth.chkmin(ans,dfs(tmpx,tmpy,1));
				vis[tmpx][tmpy]=0;
			}else{
				vis[tmpx][tmpy]=1;//回溯
				mth.chkmin(ans,dfs(tmpx,tmpy,1)+1);
				vis[tmpx][tmpy]=0;
			}
		}
	}
	return rmb[x][y]=ans;
}
int main(){
	#ifndef ONLINE_JUDGE
		freopen("test.in","r",stdin);
	#endif
	mset(rmb,-1);
	scanf("%d%d",&n,&m);
	rep(i,1,m){int x,y,c;
		scanf("%d%d%d",&x,&y,&c);
		a[x][y]=c+1;
	}
	int tmp=dfs(1,1,1);
	printf("%d",tmp==0x3f3f3f3f?-1:tmp);
//	rep(i,1,n){
//		rep(j,1,n) printf("%d ",rmb[i][j]);
//		puts("");
//	}
	return 0;
}
2021/1/31 15:37
加载中...