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\n",ans);

	}

	return 0;

}

 

你可能感兴趣的:(HDU)