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); } }