ZOJ 1002 回溯法

ZOJ 1002
题目传送门

第一次写博客,代码功底很弱,写的很乱,这道题我的思路基本就是一个最大16层树的深度优先搜索,应用回溯法解决。

//方阵上数字为0代表空格,数字为1代表墙,数字为-1代表已经放了碉堡
#include<iostream>
#include<stdio.h>
using namespace std;
char input[4][4];
int in[4][4];
int NUM=0,Max_NUM=0;
void display(int n)
{
 for (int i = 0; i < n; i++)
 {
  for (int j = 0; j < n; j++)
   cout << in[i][j] << " ";
  cout << endl;
 }
 cout << endl;
}
bool judge(int i, int j)//i为行,j为列
{
 bool a1, a2, a;
 if (in[i][j] == 1)
  a = false;
 else {
  for (int k = i; k >= 0; k--) {
   if (in[k][j] == 1)
   {
    a1 = true;
    break;
   }
   if (in[k][j] == -1) {
    a1 = false;
    break;
   }
   if (k == 0 && in[k][j] == 0) {
    a1 = true;
   }
  }
  for (int k = j; k >= 0; k--) {
   if (in[i][k] == 1)
   {
    a2 = true;
    break;
   }
   if (in[i][k] == -1) {
    a2 = false;
    break;
   }
   if (k == 0 && in[i][k] == 0) {
    a2 = true;
   }
  }
  a = a1 & a2;
 }
 return a;
}
void backtrack(int n,int k) 
{
 int row, col;
 row = k / n;
 col = k % n;
 if (k == n * n) {
  if (Max_NUM < NUM)
   Max_NUM = NUM;
 } 
 else
 {
  if (judge(row, col)) {
   in[row][col] = -1;
   NUM++;
  }
  backtrack(n, k + 1);
  if (in[row][col] == -1) {
   in[row][col] = 0;
   NUM--;
   backtrack(n, k + 1);
  }
 }
}
int main() {
 //freopen("input.txt", "r", stdin);
 int N;//方针大小
 cin >> N;
 while (N)
 {
  Max_NUM = 0;  
  for (int i = 0; i < N; i++)
   for (int j = 0; j < N; j++)
    cin >> input[i][j];
  for (int i = 0; i < N; i++)
   for (int j = 0; j < N; j++)
   {
    if (input[i][j] == '.')
     in[i][j] = 0;
    else
     in[i][j] = 1;
   }
  backtrack(N, 0);
  cout << Max_NUM << endl;
  cin >> N;
 } 
 return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值