每日一题 day5 打卡
Analysis
深搜+剪枝+瞎jb判断
1.越界
2.这个点无色
3.当前的价值已经比答案大
三种情况要剪枝
我搜索里判断要不要施法的时候没判断上一次有没有施法,白调了0.5h,呵呵~~~
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #define maxn 100+10 7 #define INF 2147483647/2-1 8 using namespace std; 9 inline int read() 10 { 11 int x=0; 12 bool f=1; 13 char c=getchar(); 14 for(; !isdigit(c); c=getchar()) if(c=='-') f=0; 15 for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0'; 16 if(f) return x; 17 return 0-x; 18 } 19 inline void write(int x) 20 { 21 if(x<0){putchar('-');x=-x;} 22 if(x>9)write(x/10); 23 putchar(x%10+'0'); 24 } 25 int m,n,ans=INF; 26 int map[maxn][maxn],val[maxn][maxn]; 27 int d1[6]={0,1,-1,0,0},d2[6]={0,0,0,1,-1}; 28 inline void dfs(int nx,int ny,int ns,int flag) 29 { 30 if(nx<1||nx>m||ny<1||ny>m||map[nx][ny]==0||ns>=val[nx][ny]) return; 31 val[nx][ny]=ns; 32 if(nx==m&&ny==m) 33 { 34 ans=min(ans,ns); 35 return; 36 } 37 for(int i=1;i<=4;i++) 38 { 39 int xx=nx+d1[i],yy=ny+d2[i]; 40 if(map[xx][yy]>0&&map[nx][ny]==map[xx][yy]) dfs(xx,yy,ns,0); 41 else if(map[xx][yy]>0&&map[nx][ny]!=map[xx][yy]) dfs(xx,yy,ns+1,0); 42 else if(map[xx][yy]==0&&!flag) 43 { 44 map[xx][yy]=map[nx][ny]; 45 dfs(xx,yy,ns+2,1); 46 map[xx][yy]=0; 47 } 48 } 49 } 50 int main() 51 { 52 memset(val,127,sizeof(val)); 53 m=read();n=read(); 54 for(int i=1;i<=n;i++) 55 { 56 int x,y,z; 57 x=read();y=read();z=read(); 58 map[x][y]=z+1; 59 } 60 dfs(1,1,0,false); 61 if(ans==INF) write(-1); 62 else write(ans); 63 return 0; 64 }
请各位大佬斧正(反正我不认识斧正是什么意思)