hdu 4499 搜索

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4499

//主要剪枝:避免与以前枚举的发生冲突。要回溯即把G[x][y]归零。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;

const int maxe = 50000;
const int maxn = 10;
const int INF  = 0x3f3f3f;

int N,M,Q;
int G[maxn][maxn];
int ans;

void dfs(int x,int y,int val){ // printf("%d   %d     %d  %d  %d\n",x,y,val,N,M);
    if(y >= M)  { dfs(x+1,0,val); return; }
    if(x >= N){
        ans = max(ans,val);
        return;
    }
    if(G[x][y]) { dfs(x,y+1,val); return; }

    dfs(x,y+1,val);  //此处不安放canon;这句话不能放到回溯的后面去,因为“在x,y这个地方安放canon”不一定访问的到

    int i,j;
    bool flag = false;
    for(i=x;i>=0;i--){
        if(G[i][y])
           break;
    }
    for(j=i-1;j>=0;j--){
        if(G[j][y]){
            if(G[j][y] == 2) flag = true;
            break;
        }
    }
    if(flag) return;
    for(i=y;i>=0;i--){
        if(G[x][i])  break;
    }
    for(j=i-1;j>=0;j--){
        if(G[x][j]){
            if(G[x][j] == 2) flag = true;
            break;
        }
    }
    if(flag)  return;
    G[x][y] = 2;  //在x,y这个地方安放canon;
    dfs(x,y+1,val+1);
    G[x][y] = 0;
}
int main()
{
   // freopen("E:\\acm\\input.txt","r",stdin);
    while(cin>>N>>M>>Q){
        memset(G,0,sizeof(G));
        for(int i=1;i<=Q;i++){
            int a,b;
            scanf("%d %d",&a,&b);
            G[a][b] = 1;
        }
        ans = 0;
        dfs(0,0,0);
        printf("%d\n",ans);
    }
}
View Code

 

posted @ 2013-08-25 10:48  等待最好的两个人  阅读(224)  评论(0编辑  收藏  举报