dfs终极警告
查看原帖
dfs终极警告
124564
Austra楼主2020/11/1 11:26

终极警告:走不到终点

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int m,n,a[101][101],ans=10000000;
bool mark[101][101];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
void dfs(int x,int y,int sum,bool mod){
    if(sum>=ans)return ;
    if(x==m&&y==m){cout<<sum;ans=sum;return ;}
    for(int i=0;i<4;i++)
        if(x+dx[i]>=1&&x+dx[i]<=m&&y+dy[i]>=1&&y+dy[i]<=m&&!mark[x+dx[i]][y+dy[i]]){
            if(a[x+dx[i]][y+dy[i]]==2)
                if(!mod){
                    mark[x+dx[i]][y+dy[i]]=1,a[x+dx[i]][y+dy[i]]=a[x][y];
                    dfs(x+dx[i],y+dy[i],sum+2,1);
                    mark[x+dx[i]][y+dy[i]]=0,a[x+dx[i]][y+dy[i]]=2;}
            else if(a[x+dx[i]][y+dy[i]]!=a[x][y]){
                mark[x+dx[i]][y+dy[i]]=1;
                dfs(x+dx[i],y+dy[i],sum+1,0);
                mark[x+dx[i]][y+dy[i]]=0;}
            else {
                mark[x+dx[i]][y+dy[i]]=1;
                dfs(x+dx[i],y+dy[i],sum,0);
                mark[x+dx[i]][y+dy[i]]=0;}
        }
}
int main(){
    cin>>m>>n;
    for(int i=1;i<=m;i++)
        for(int j=1;j<=m;j++)a[i][j]=2;
    for(int i=1;i<=n;i++){
        int x,y,c;
        cin>>x>>y>>c;
        a[x][y]=c;
    }
    mark[1][1]=1;
    dfs(1,1,0,0);
    if(ans==10000000) cout<<-1;
    else cout<<ans;
    return 0;
}
2020/11/1 11:26
加载中...