这场的c实在不想做,sad。
D:
标记一下每一个点8个方向不经过黑点最多能到达多少个黑点。
由题意可知,三角形都是等腰三角形,那么我们就枚举三角形的顶点。
对于每一个定点,有8个方向可以放三角形。
然后枚举8个方向,然后枚举腰的长度。然后判断是否可行。
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include <algorithm> using namespace std; int maps[501][501]; char str[501]; int dx[11]= {-1, 0, 1, 0,-1, -1, 1, 1,-1,-1}; int dy[11]= { 0, 1, 0,-1, 0, 1, 1,-1,-1, 1}; int dp[550][550][10]; int n,m; int pan(int x,int y) { if(x<1||x>n||y<1||y>m)return 1; if(maps[x][y])return 1; return 0; } int main() { while(~scanf("%d%d",&n,&m)) { for(int i=1; i<=n; i++) { scanf("%s",str); for(int j=1; j<=m; j++) { if(str[j-1]=='0')maps[i][j]=0; else maps[i][j]=1; } } int ans=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { if(maps[i][j])continue; for(int q=0;q<9;q++) { dp[i][j][q]=1; if(q==4)continue; for(int k=1;;k++) { int xx=i+dx[q]*k; int yy=j+dy[q]*k; if(pan(xx,yy))break; dp[i][j][q]++; } } } for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(maps[i][j])continue; for(int q=0; q<9; q++) { if(q==4)continue; for(int k=1; ; k++) { int xx=i+dx[q]*k; int yy=j+dy[q]*k; if(pan(xx,yy)||pan(i+dx[q+1]*k,j+dy[q+1]*k)) { break; } if(q==0&&dp[xx][yy][6]>=k+1)ans++; if(q==1&&dp[xx][yy][7]>=k+1)ans++; if(q==2&&dp[xx][yy][8]>=k+1)ans++; if(q==3&&dp[xx][yy][5]>=k+1)ans++; if(q==5&&dp[xx][yy][2]>=k*2)ans++; if(q==6&&dp[xx][yy][3]>=k*2)ans++; if(q==7&&dp[xx][yy][0]>=k*2)ans++; if(q==8&&dp[xx][yy][1]>=k*2)ans++; //cout<<i<<" "<<j<<" "<<q<<" "<<k<<endl; } } } } cout<<ans<<endl; } return 0; }
Codeforces Round #249 (Div. 2)-D,布布扣,bubuko.com
Codeforces Round #249 (Div. 2)-D
原文地址:http://blog.csdn.net/rowanhaoa/article/details/35787491