【搜索 回溯】 zoj 1002

题意:一些机枪彼此不能在同一行和同一列,但是由于有墙的阻隔,能保证子弹无法穿透,即可以同行同列,现问如果说给了一个n*n(n<=4)的矩阵,并给出了墙的分布情况,能否求出最大能繁殖的机枪数。

思路:之前按八皇后的思想一行一行搜,不理想,之后改成一个格一个格的搜,回溯要理解好就没问题。

#include <iostream>
#include <cstdio>
using namespace std;
int n,best;
char map[4][4];
int canput(int row,int col)
{
  int i;
  for(i=row-1;i>=0;i--)  //如果(row,col)左面的先是遇到墙,则可行
  {
     if(map[i][col]==‘X‘)
     {
         break;
     }
     if(map[i][col]==‘Y‘)//如果(row,col)左面的先是遇到机枪,则跪
     {
         return 0;
     }
  }
  for(i=col-1;i>=0;i--) //如果(row,col)上面的先是遇到墙,则可行
  {
     if(map[row][i]==‘X‘)
     {
        break;
     }
     if(map[row][i]==‘Y‘)//如果(row,col)上面的先是遇到机枪,则跪
     {
        return 0;
     }
  }
  return 1;
}
void backtrack(int k,int cur)//K表示放置炮塔的位置(1~16),cur表示当前放置的总数
{
   int x,y;
   if(k==n*n)
   {
       if(cur>best)
       {
           best=cur;
       }
       return;
   }
   else
   {
     x=k/n;
     y=k%n;
     if(map[x][y]==‘.‘&& canput(x,y))
     {
        map[x][y]=‘Y‘;
        backtrack(k+1,cur+1); //加入此机枪点,深度dfs
        map[x][y]=‘.‘;   //不加入此机枪点,回溯
     }
     backtrack(k+1,cur);//(x,y)能加入机枪却不加 和 不能加入机枪的两种情况统一在此处理
     //即处理下一个点而认为不加入
   }
}
int main()
{
//    freopen("in.txt","r",stdin);
    while(cin >> n && n != 0)
    {
       best=0;
       for(int i=0;i
       {
          for(int j=0;j
          {
             char ch=getchar();
             if(ch==‘\n‘) //为了吸收每个句尾的回车
             {
                j--;
                continue;
             }
             else map[i][j]=ch;
          }
       }
       backtrack(0,0);
       printf("%d\n",best);
    }
    return 0;
}
时间: 2024-10-13 01:36:59

【搜索 回溯】 zoj 1002的相关文章

DFS ZOJ 1002/HDOJ 1045 Fire Net

题目传送门 1 /* 2 题意:在一个矩阵里放炮台,满足行列最多只有一个炮台,除非有墙(X)相隔,问最多能放多少个炮台 3 搜索(DFS):数据小,4 * 4可以用DFS,从(0,0)开始出发,往(n-1,n-1)左下角走,x = cnt / n; y = cnt % n; 更新坐标, 4 直到所有点走完为止,因为从左边走到右边,只要判断当前点左上方是否满足条件就可以了 5 注意:当前点不能放炮台的情况也要考虑 6 g[x][y] == 'o'; 的错误半天才检查出来:) 7 */ 8 #inc

ZOJ 1002 Fire Net

columns, each representing a street or a piece of wall. A blockhouse is a small castle that has four openings through which to shoot. The four openings are facing North, East, South, and West, respectively. There will be one machine gun shooting thro

[ZOJ 1002] Fire Net (简单地图搜索)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1002 题目大意: 给你一个n*n的地图,地图上的空白部分可以放棋子,也有墙,问最多能放多少棋子使得棋子两两不会袭击? 棋子袭击当且仅当处在同一行或者同一列上并且中间没有墙的阻隔. 真是好久没写过搜索题了..这道题都写了这么久!! 直接写dfs(x,y,now) 代表我现在站在x点,y点上,那么就只能产生两种状态,放棋子或者不放棋子. 然后写一个C(x,y)代表当

[算法专题] 深度优先搜索&amp;回溯剪枝

1. Palindrome Partitioning https://leetcode.com/problems/palindrome-partitioning/ Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s. For example, given s = "aab&

ZOJ 1002 DFS

Fire Net Time Limit: 2 Seconds      Memory Limit: 65536 KB Suppose that we have a square city with straight streets. A map of a city is a square board with n rows and n columns, each representing a street or a piece of wall. A blockhouse is a small c

ZOJ 1002 Fire Net(dfs)

嗯... 题目链接:https://zoj.pintia.cn/problem-sets/91827364500/problems/91827364501 这道题是想出来则是一道很简单的dfs: 将一个4*4的地图给每一个点排序,如下图: 0  1  2  3 4  5  6  7 8  9  10  11 12 13 14 15 设一个点为第k个点,那么它的坐标为(k/n,k%n),根据这个进行dfs,当k == n * n是退出dfs.如果k < n *n,就继续dfs,判断是否能放下,即要

POJ2488 深度优先搜索+回溯

POJ2488 题目 骑士按照下图所示的走法对棋盘进行巡逻,每个格子只允许巡逻一次,且必须巡逻所有格子.给定棋盘的行数p和列数q,输出一条骑士巡逻路径,若不存在这样一条路径,则输出impossible. 图1 骑士的8种走法 骑士巡逻问题的简化版本,是哈密顿路径问题的特殊形式,但是是线性时间内可以解决的\(^{[1]}\). Sample Input 3 1 1 2 3 4 3 Sample Output Scenario #1: A1 Scenario #2: impossible Scena

79. 单词搜索-回溯算法(leetcode)

给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被重复使用. 想法:本题跟我们9021 quiz7-8的类型是一样的,9024也用C写过一次,都是在二维数组里搜索,用回溯算法,今天脑袋有点不清醒,以后多刷几次. 学到的点: 1. 每一步递归中,都要注意判断 start_x,start_y的取值范围 2. 学到了python里面的语法还可以直接大于小于判断.

AOJ894 种花【图的搜索+回溯】

题面: 花老师有一个农场,农场的花一共有 4 种颜色, 花老师不喜欢老旧的东西,所以,她希望每天种花的方案都不一样.特别地,她也觉得两种一样颜色的花种在相邻的位置会很无聊.现在,她想知道,一共有多少种花的方案.这里要注意的是,农场的种花的位置是不规则的.因此我们给出一对一对的相邻的位置的关系. Input 第一行两个数 N 和 M,表示种花的位置的个数和相邻的位置的对数 接下来 M 行,每行一组数 A, B 表示 A, B 相邻 Output 一个数表示染色方法数 Sample Input 5