题目链接:http://codeforces.com/problemset/problem/825/B
--------------------------------------------------------------------------------
题意:五子棋,在输入条件下,能否在当前局面获胜。
思路:很明显的是,当我们下五子棋时,我们每步都是进行一次搜索,观察能否连接成为5个。同理,利用计算机也可以向各个方向进行搜索。好在本题只是10X10的棋面,直接对每个点进行4个方向(水平,竖直,主对角线,次对角线)进行暴力。遇到非‘X‘的符号停止。
代码:
#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; }