zoukankan      html  css  js  c++  java
  • Uva 639 Don't Get Rooked

      Don't Get Rooked 

    题目的内容只是在四皇后的基础之上加上了点障碍,处理的方式还是一样,如果是四皇后的问题的话,那么可以一行一行的放置,现在的问题可以一行放两个(在中间被墙阻挡的时候)这时就要将一行分开遍历,将墙的两边看做是不同的行处理

    题目链接:

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=108&page=show_problem&problem=580

     1 #include<stdio.h>
     2 #include<string.h>
     3 #define MAXN 6
     4 int maze[MAXN][MAXN], visit[MAXN][MAXN];
     5 int max;
     6 
     7 int checkcolumn(int x, int y, int n)
     8 {//只是判断上方是不是墙壁或者已放有车
     9     int i, j, up;
    10     for(i=x; i>=0 && maze[i][y] != MAXN && maze[i][y] != 1; --i);
    11     if(i<0 || maze[i][y] == MAXN) return 1;
    12     else return 0;
    13 }
    14 
    15 int Traverse(int x, int y, int cnt, int n)
    16 {
    17     int i, j, left, right, flag = 0, t;
    18     if(x == n)
    19     {//x == n是表示整个遍历完成
    20         if(max < cnt) max = cnt;
    21         return 0;
    22     }
    23     for(t=y; t<n && maze[x][t] == MAXN; ++t); //除去一开始的连续墙壁
    24     if(t >=n ) Traverse(x+1, 0, cnt, n); //如果一行都是墙壁,那下面就没戏了,但生活还是需要继续的,对吗?所以继续遍历下一行
    25     for(left=t; left<n && maze[x][left] != MAXN; ++left)
    26         ; //找到这一行中可行的列,遇到墙壁结束,主要是为了分割出一行中的子行
    27     flag = left >= n ? 0 : 1; //判断这行遍历后是否需要转为下一行,即能够判断出右边还有没子行(一行中墙壁后面的墙)
    28     for(j=t; j<left; ++j)
    29     {
    30         if(checkcolumn(x, j, n)) 
    31         {
    32             maze[x][j] = 1;
    33             if(!flag)Traverse(x+1, 0, cnt+1, n);
    34             else    Traverse(x, left, cnt+1, n);
    35             maze[x][j] = 0;
    36         }
    37         else 
    38         {//如果不允许添加车,那么就继续遍历咯,cnt的值不变而已
    39             if(!flag)Traverse(x+1, 0, cnt, n);
    40             else    Traverse(x, left, cnt, n);
    41         }
    42     }
    43     return 0;
    44 }
    45 
    46 int main()
    47 {
    49     int i, j, n, x, y, temp, r, c, cnt;
    50     char input;
    51     while(scanf("%d", &n) != EOF && n)
    52     {
    53         getchar(); 
    54         max = flag = 0;
    55         memset(maze, 0, sizeof(maze));
    56         for(i=0; i<n; ++i)
    57         {
    58             for(j=0; j<n; ++j)
    59             {
    60                 scanf("%c", &input);
    61                 if(input == 'X') maze[i][j] =  MAXN;
    67 } 68 getchar(); 69 } 70 cnt = 0; 71 Traverse(0, 0, cnt, n); 72 printf("%d\n", max); 74 } 75 return 0; 76 }
    物役记

    更多内容请关注个人微信公众号 物役记 (微信号:materialchains)

  • 相关阅读:
    [zt]petshop4.0 详解之二
    HOW TO: Implement a DataSet JOIN helper class in Visual C# .NET(DataSetHelper)
    DVGPrinter 设置列宽
    [转载]ASP.NET 的学习流程
    初级版FAQ
    [转]PetShop的系统架构设计(1)
    [zt] petshop4.0 详解之三
    mssql2000 jdbc驱动设置
    自动设置环境变量
    Ubuntu中VirtualBox不能使用USB(此法不通)
  • 原文地址:https://www.cnblogs.com/liaoguifa/p/3039287.html
Copyright © 2011-2022 走看看