hdu1175

来源:互联网 发布:淘宝极有假货有假货吗 编辑:程序博客网 时间:2024/06/16 14:26
/*
分析:

    简单深搜,62MS。

    因为转折数不能超过两次,所以对于1000*1000的,不出意外深搜可行。

犯2了。。。一开始传递的d=-1,所以代码行49里面,应该是
“if(i!=d&&d!=-1)”而不是“if(i!=d)”,白WA了好几次。
记性真差,以后将有必要的点儿都写下来,记一下,要不再犯
这种错误,而且没有检查出来,不是2死了么。。。

    没啥说的,对于搜索还是要注意剪枝吧,这个很~重要。

  思路:
    没啥说的,代码挺清晰的。

                                                2012-04-25
*/







#include"stdio.h"#include"string.h"int num[1011][1011];int flag[1011][1011];int n,m;int ans;int x_end,y_end;int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};void DFS(int x,int y,int times,int d){int i;int next_x,next_y;///判断1if(ans==1)return ;if(times>2)return ;if(times==2&&x-x_end!=0&&y-y_end!=0)    //一会儿试试把这个去掉时间会加多少。   An:不去62MS,去了,7765MS。。。return ;///判断2if(x==x_end&&y==y_end&×<=2){ans=1;return ;}///搜索for(i=0;i<4;i++){next_x=x+dir[i][0];next_y=y+dir[i][1];if(next_x<=0||next_x>n||next_y<=0||next_y>m)continue;if(next_x==x_end&&next_y==y_end);else if(num[next_x][next_y]!=0)continue;if(flag[next_x][next_y]!=0)continue;if(d==-1)           //这个怎么优化?这个判断只在第一次DFS的时候用到了,只用了一次。;else if(i!=d)times++;flag[next_x][next_y]=1;DFS(next_x,next_y,times,i);flag[next_x][next_y]=0;if(i!=d&&d!=-1)times--;}}int main(){int i,l;int q;int x_start,y_start;while(scanf("%d%d",&n,&m),m||n){memset(flag,0,sizeof(flag));for(i=1;i<=n;i++){for(l=1;l<=m;l++)scanf("%d",&num[i][l]);}scanf("%d",&q);for(i=0;i<q;i++){scanf("%d%d%d%d",&x_start,&y_start,&x_end,&y_end);if(x_start==x_end&&y_start==y_end){printf("NO\n");continue;}if(num[x_start][y_start]!=num[x_end][y_end]||num[x_start][y_start]==0||num[x_end][y_end]==0){printf("NO\n");continue;}ans=0;flag[x_start][y_start]=1;DFS(x_start,y_start,0,-1);flag[x_start][y_start]=0;if(ans==1)printf("YES\n");elseprintf("NO\n");}}return 0;}


原创粉丝点击