HDU 4499 Cannon

题意:

思路:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<stdlib.h>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
const int MAXN=10+5;
int n,m,Q,ans;
int mat[MAXN][MAXN];
void dfs(int x, int y, int cnt)
{
	if(x>=n)
	{
		ans=max(ans,cnt);
		return;
	}
	if(y>=m)
	{
		dfs(x+1,0,cnt);
		return;
	}
	if(mat[x][y])
	{
		dfs(x,y+1,cnt);
		return;
	}
	dfs(x,y+1,cnt);
	int t;
	bool flag=false;
	for(t=x-1;t>=0;t--)
		if(mat[t][y])
			break;

	for(int i=t-1;i>=0;i--)
	{
		if(mat[i][y])
		{
			if(mat[i][y]== 2)
			{
				flag=true;
			}
			break;
		}
	}
	if(flag)
	{
		return;
	}
	for(t=y-1;t>=0;t--)
	{
		if(mat[x][t])
			break;
	}
	for(int j=t-1;j>=0;j--)
	{
		if(mat[x][j])
		{
			if(mat[x][j]== 2)
			{
				flag=true;
			}
			break;
		}
	}
	if(flag)
	{
		return;
	}
	mat[x][y]=2;
	dfs(x,y+1,cnt+1);
	mat[x][y]=0;
}

int main()
{
	while(scanf("%d %d %d",&n,&m,&Q)!=EOF)
	{
		memset(mat,0,sizeof(mat));
		for(int i=0;i<Q;i++)
		{
		    int x,y;
			scanf("%d %d",&x,&y);
			mat[x][y]=1;
		}
		ans=0;
		dfs(0,0,0);
		printf("%d
",ans);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/sola1994/p/4552842.html