(AC)五子棋
题目描述
五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连珠者获胜。
五子连珠是在横线,纵线,斜线,反斜线四个方向上形成五子及以上的连线,当出现多于五子的连珠时,也只记为一次五子连珠。
五子连珠总数等于棋局中的所有方向上的五子连珠连线的数量之和。
我们想知道,给定一个长宽皆为n的棋局,白棋落在哪些点可以增加白棋五子连珠总数?
对增加白棋五子连珠总数的举例说明 (A点为我们选择的落点):
1
wwwwAbbbb
落白棋之前未形成五子连珠,落入白棋之后,五子连珠总数加一,满足要求。
2
wwwwwAbbbb
落白棋之前已经形成五子连珠,落白棋之后,五子连珠总数不变,不满足要求。
3
wwwwwAwwwww
落白棋之前五子连珠总数为二,落入白棋之后,两边连成一线,五子连珠总数减一,不满足要求。
4
*w***w88888
**w**w*****
***w*w*****
****ww*****
wwwwwAwwwww
落白棋之前五子连珠总数为二。落入白棋之后,两边连成一线,斜向和纵向形成新的五子连珠,总数为三。五子连珠总数加一,这个点满足要求。输入
输入为第一行为一个数字n(n≤40),表示棋盘大小。
接下来的n行,每行为n个字符,可能有三种字符,* 表示无棋子,b 表示黑棋,w 表示白棋。
输入棋局中可能已经有五子连珠的情况,我们需要计算能增加白棋五子连珠总数的白棋落点。输出
输出为k行,包括k个满足要求的落点,k个点按照从左至右,从上至下的顺序输出,即先按行排序,再按列排序输出。
每行为一个点坐标y,x,分别表示列坐标,行坐标,以空格分隔,坐标序号从0开始,棋盘左上角为原点。
*a***
*****
*****
*****
***b*
图中a点的坐标为1 0 ,b 点的坐标为 3 4 。样例输入
复制
8 ****b*bb *****b*b bb*bbbw* w*wbwwww bwwbwwbw ww**wbbw *bww***w ***bwb*b
样例输出
复制
7 2 2 5 3 5 4 6 2 7
一个注释折磨我两小时
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;int n;
char chess[45][45];int check(){int ans=0;int t;for(int i=0;i<n;++i){t=0;for(int j=0;j<n;++j){if(chess[i][j]!='w'){if(t>=5)ans++;t=0;}else t++;}if(t>=5)ans++;}for(int j=0;j<n;++j){t=0;for(int i=0;i<n;++i){if(chess[i][j]!='w'){if(t>=5)ans++;t=0;}else t++;}if(t>=5)ans++;}for(int i=0;i<n;++i){t=0;int x=i,y=0;while(x<n&&y<n){if(chess[x][y]!='w'){if(t>=5)ans++;t=0;}else t++;x++;y++;}if(t>=5)ans++;}for(int j=1;j<n;++j){t=0;int x=0,y=j;while(x<n&&y<n){if(chess[x][y]!='w'){if(t>=5)ans++;t=0;}else t++;x++;y++;}if(t>=5)ans++;}for(int j=0;j<n;++j){t=0;int x=0,y=j;while(x<n&&y>=0){if(chess[x][y]!='w'){if(t>=5)ans++;t=0;}else t++;x++;y--;}if(t>=5)ans++;}for(int i=1;i<n;++i){//j=n-1t=0;int x=i,y=n-1;while(x<n&&y>=0){if(chess[x][y]!='w'){if(t>=5)ans++;t=0;}else t++;x++;y--;}if(t>=5)ans++;}return ans;
}int find(int x,int y,int sign){if(sign){if(chess[x][y]=='*')chess[x][y]='w';else return 0;}int t=check(); if(sign)chess[x][y]='*';return t;
}struct babi{int x,y;
};
bool cmp(babi a,babi b){if(a.x!=b.x)return a.x<b.x;return a.y<b.y;
}int main(){ios::sync_with_stdio(false);cin>>n;for(int i=0;i<n;++i){for(int j=0;j<n;++j)cin>>chess[i][j];}int mx=find(0,0,0);//cout<<mx<<"\n";babi res[10000];int k=0;for(int i=0;i<n;++i){for(int j=0;j<n;++j){if(find(i,j,1)>mx){res[k].x=i;res[k++].y=j;}}}sort(res,res+k,cmp);for(int i=0;i<k;++i){cout<<res[i].y<<" "<<res[i].x<<'\n';}return 0;
}