zoukankan      html  css  js  c++  java
  • hdu 1175 连连看(深搜)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175

    题意:判断两个位置的图案能否消除(存在不超过两次拐弯的连线)。

    解题过程:

    1、一开始开vis[][]记录已走过的位置,每个位置只能走一次。这样明显不行,因为一些拐弯超过两次的路线会与正确的路线重合,那么正确的路线就行不通了。

    2、跳出条件设置的地方错了,导致暴栈。

     1 #include <cstdio>
     2 #include <cstring>
     3 #define N 1005
     4 
     5 int a[N][N], n, m, flag, x1, x2, y1, y2, ans;
     6 int dir[4][2] = {1,0,-1,0,0,1,0,-1};
     7 
     8 void dfs(int x0, int y0, int xn, int yn)
     9 {
    10     if(xn==x2 && yn==y2) {ans = 1return;}
    11     for(int i=0; i<4; i++)
    12     {
    13         if(ans==1return;
    14         int xnn = xn + dir[i][0], ynn = yn + dir[i][1];
    15         if(xnn==x0 && ynn==y0) continue;
    16         if(xnn<=n && xnn>=1 && ynn<=m && ynn>=1 && a[xnn][ynn]==0)
    17         {
    18             if(xnn!=x0 && ynn!=y0)
    19             {
    20                 if(flag>=2continue;
    21                 flag++;
    22                 dfs(xn, yn, xnn, ynn);
    23                 flag--;
    24             }
    25             else
    26                 dfs(xn, yn, xnn, ynn);
    27         }
    28     }
    29 }
    30 
    31 int main()
    32 {
    33     int q;
    34     while(scanf("%d%d",&n,&m)!=EOF)
    35     {
    36         if(n==0 && m==0break;
    37         for(int i=1; i<=n; i++)
    38             for(int j=1; j<=m; j++)
    39                 scanf("%d",&a[i][j]);
    40         scanf("%d",&q);
    41         for(int i=1; i<=q; i++)
    42         {
    43             ans = 0; flag = 0;
    44             scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    45             if(x1==x2 && y1==y2) printf("NO ");
    46             else
    47             {
    48                 if(a[x1][y1]==a[x2][y2] && a[x1][y1]!=0)
    49                 {
    50                     int temp2 = a[x2][y2];
    51                     a[x2][y2] = 0;
    52                     dfs(x1,y1,x1,y1);
    53                     a[x2][y2] = temp2;
    54                 }
    55                 if(ans==1)
    56                     printf("YES ");
    57                 else
    58                     printf("NO ");
    59             }
    60         }
    61     }
    62     return 0;
    63 }
    View Code

     /*

    13 5
    0 0 0 0 0
    0 0 0 4 0
    0 0 0 4 0
    0 0 0 4 0
    0 0 0 4 0
    0 0 0 4 0
    0 0 0 4 0
    0 0 0 4 0
    0 0 0 4 0
    0 0 0 4 0
    0 4 1 4 0
    0 4 4 4 0
    0 0 0 0 1
    1
    13 5 11 3
    YES

    */

  • 相关阅读:
    STL实现的底层数据结构简介
    C++ STL中Map的按Key排序和按Value排序
    algorithm库介绍之---- stable_sort()方法 与 sort()方法 .
    git取消更改 恢复版本命令
    unbuntu下清理磁盘空间
    x265编码命令
    SQLServer数据库获取重复记录中日期最新的记录
    牛逼哄哄的 Lambda 表达式,简洁优雅就是生产力!
    哎!又要过年了,程序员最怕问到什么?
    swagger 使用指南
  • 原文地址:https://www.cnblogs.com/byluoluo/p/3473970.html
Copyright © 2011-2022 走看看