CodeForces 831A(模拟&贪心_E题)解题报告
题目链接:http://codeforces.com/problemset/problem/831/A
--------------------------------------------------------------------------------
题意:问是否为这样的一组队列,满足:先增,后不变,再减少。注意边界条件。
思路:似乎可以直接对每个点进行测试,由于数据较少,能够完成。然而,比较好的解法应该采用模拟的方式,按照所要求的方式,进行模拟操作,“哨兵”能够到达最后点时证明该队列能够满足条件。
注意:开数组时往往会开大一些,然而本题需要在最后设置一个终点,防止比较时候超出比较范围。
代码:

#include<cstdio> using namespace std; const int MAXN=10+5; char a[MAXN][MAXN]; int main(void){ int flag =0; for(int i=0;i<10;i++){ scanf("%s",&a[i]); } for(int i=0;i<10;i++){ for(int j=0;j<10;j++){ if(a[i][j]=='.'){ int sum =0; for(int t =1;t<=4&&(j-t)>=0;t++){ if(a[i][j-t]!='X') break; else sum++; if(sum >=4) flag =1; } for(int t =1;t<=4&&(j+t)<10;t++){ if(a[i][j+t]!='X') break; else sum++; if(sum >=4) flag =1; } sum =0; for(int t =1;t<=4&&(i-t)>=0;t++){ if(a[i-t][j]!='X') break; else sum++; if(sum >=4) flag =1; } for(int t =1;t<=4&&(i+t)<10;t++){ if(a[i+t][j]!='X') break; else sum++; if(sum >=4) flag =1; } sum =0; for(int t =1;t<=4&&(i-t)>=0&&(j-t)>=0;t++){ if(a[i-t][j-t]!='X') break; else sum++; if(sum >=4) flag =1; } for(int t =1;t<=4&&(i+t)<10&&(j+t)<10;t++){ if(a[i+t][j+t]!='X') break; else sum++; if(sum >=4) flag =1; } sum =0; for(int t =1;t<=4&&(i-t)>=0&&(j+t)<10;t++){ if(a[i-t][j+t]!='X') break; else sum++; if(sum >=4) flag =1; } for(int t =1;t<=4&&(i+t)<10&&(j-t)>=0;t++){ if(a[i+t][j-t]!='X') break; else sum++; if(sum >=4) flag =1; } } } } if(flag ==1) printf("YES\n"); else printf("NO\n"); return 0; }