标签:
Time Limit: 20 Sec
Memory Limit: 256 MB
http://acm.hdu.edu.cn/showproblem.php?pid=4499
Input
Output
There is only one line for each test case, containing the maximum number of cannons.
Sample Input
4 4 2
1 1 1 2
5 5 8
0 0 1 0 1 1 2 0 2 3 3 1 3 2 4 0
8
9
题意
在一个象棋棋盘上放炮,要求两个炮不能互相打到,然后问你最多能放几个炮
题解:
直接dfs就好了,范围很小
代码:
//qscqesze #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define test freopen("test.txt","r",stdin) #define maxn 2000001 #define mod 10007 #define eps 1e-9 int Num; char CH[20]; const int inf=0x3f3f3f3f; const ll infll = 0x3f3f3f3f3f3f3f3fLL; inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } inline void P(int x) { Num=0;if(!x){putchar(‘0‘);puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts(""); } //************************************************************************************** int a[30],b[30],visit[7][7],n,m,q,ans; 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(visit[x][y]){ dfs(x,y+1,cnt); return; } dfs(x,y+1,cnt); int t,flag=0; for(t=y-1;t>=0;t--) if(visit[x][t]) break; for(int i=t-1;i>=0;i--) { if(visit[x][i]==2) {flag=1;break;} if(visit[x][i]) break; } if(flag)return;//判断这一列上是否存在炮互吃 for(t=x-1;t>=0;t--) if(visit[t][y]) break; for(int i=t-1;i>=0;i--){ if(visit[i][y]==2) {flag=1;break;} if(visit[i][y]) break; } if(flag) return;//判断这一行上是否存在炮互吃 visit[x][y]=2; dfs(x,y+1,cnt+1); visit[x][y]=0;//回溯 } int main() { while(scanf("%d%d%d",&n,&m,&q)!=EOF){ memset(visit,0,sizeof(visit)); for(int i=0;i<q;i++){ scanf("%d%d",&a[i],&b[i]); visit[a[i]][b[i]]=1; } ans=0; dfs(0,0,0); printf("%d\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/qscqesze/p/4548442.html