2015ccpc G - Ancient Go(围棋dfs爆搜)
2017-11-27 22:49
274 查看
点击打开链接
题意:给定一个9*9的棋盘,问黑子能否在下一步将白子围住。
由于数据不大,可以直接将'.'换成'x',用DFS搜索。
AC code
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
char chess[11][11];
bool visit[11][11];
int turnx[4]={1,-1,0,0};
int turny[4]={0,0,1,-1};
int flag;
bool in(int x,int y)
{
if(x<0||y<0||x>=9||y>=9)
return 0;
return 1;
}
void dfs(int x,int y)//寻找以o为初始点周围是不是没有出路了,即没有.出现
{
if(chess[x][y]=='.')//如果有出路,则标记为0,说明在该点下子无法获胜
{
flag=0;
return;
}
for(int k=0;k<4;k++)
{
int nx=x+turnx[k];
int ny=y+turny[k];
if(in(nx,ny)&&!visit[nx][ny]&&chess[nx][ny]!='x')
{
visit[nx][ny]=1;
dfs(nx,ny);
}
}
}
int solve()
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(chess[i][j]=='.')
{
chess[i][j]='x';
for(int k=0;k<4;k++)
{
int nx=i+turnx[k];
int ny=j+turny[k];
if(in(nx,ny)&&chess[nx][ny]=='o')
{
memset(visit,0,sizeof(visit));
visit[nx][ny]=1;
flag=1;
dfs(nx,ny);
if(flag) return 1;//直接返回,跳出循环
}
}
chess[i][j]='.';//还原
}
}
}
return 0;
}
int main()
{
int T,cas=1;scanf("%d",&T);
while(T--)
{
for(int i=0;i<9;i++) scanf("%s",chess[i]);
flag=1;
memset(visit,0,sizeof(visit));
int ans=solve();
if(ans) printf("Case #%d: Can kill in one move!!!\n",cas++);
else printf("Case #%d: Can not kill in one move!!!\n",cas++);
}
return 0;
}
题意:给定一个9*9的棋盘,问黑子能否在下一步将白子围住。
由于数据不大,可以直接将'.'换成'x',用DFS搜索。
AC code
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
char chess[11][11];
bool visit[11][11];
int turnx[4]={1,-1,0,0};
int turny[4]={0,0,1,-1};
int flag;
bool in(int x,int y)
{
if(x<0||y<0||x>=9||y>=9)
return 0;
return 1;
}
void dfs(int x,int y)//寻找以o为初始点周围是不是没有出路了,即没有.出现
{
if(chess[x][y]=='.')//如果有出路,则标记为0,说明在该点下子无法获胜
{
flag=0;
return;
}
for(int k=0;k<4;k++)
{
int nx=x+turnx[k];
int ny=y+turny[k];
if(in(nx,ny)&&!visit[nx][ny]&&chess[nx][ny]!='x')
{
visit[nx][ny]=1;
dfs(nx,ny);
}
}
}
int solve()
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(chess[i][j]=='.')
{
chess[i][j]='x';
for(int k=0;k<4;k++)
{
int nx=i+turnx[k];
int ny=j+turny[k];
if(in(nx,ny)&&chess[nx][ny]=='o')
{
memset(visit,0,sizeof(visit));
visit[nx][ny]=1;
flag=1;
dfs(nx,ny);
if(flag) return 1;//直接返回,跳出循环
}
}
chess[i][j]='.';//还原
}
}
}
return 0;
}
int main()
{
int T,cas=1;scanf("%d",&T);
while(T--)
{
for(int i=0;i<9;i++) scanf("%s",chess[i]);
flag=1;
memset(visit,0,sizeof(visit));
int ans=solve();
if(ans) printf("Case #%d: Can kill in one move!!!\n",cas++);
else printf("Case #%d: Can not kill in one move!!!\n",cas++);
}
return 0;
}
相关文章推荐
- HDU5546 Ancient Go(深搜DFS)(2015CCPC)
- 【HDU5546 2015 CCPC 南阳国赛G】【DFS】Ancient Go 棋盘围杀 优化写法O(n^2)
- 2015 南阳 CCPC G.Ancient Go
- 2015 CCPC Ancient Go
- 2015 南阳理工CCPC Ancient Go
- Ancient Go---hdu5546(dfs爆搜CCPC题目)
- Ancient Go【ccpc dfs】
- hdu 5546 Ancient Go(2016ccpc) 暴力DFS
- HDU 5546 Ancient Go (ccpc2015南阳G)
- 2015 南阳 CCPC hdu 5546 Ancient Go(DFS,暴力)
- 【HDU5544 2015CCPC 南阳国赛E】【树上dfs找本质不同环 高斯消元 时间戳优化】Ba Gua Zhen 连通图上最大异或环
- [HDOJ] 5546 Ancient Go [DFS]
- The 2015 China Collegiate Programming Contest G. Ancient Go hdu 5546
- hdu 5546 Ancient Go【dfs】【思维】
- HDOJ 5546 Ancient Go(qwb铜牌题 DFS搜索)
- HDU 5546 Ancient Go(DFS)
- HDU 5546 Ancient Go (dfs)
- HDU~5546 Ancient Go(暴力dfs)
- 组队赛2(B/G——Ancient Go)HDU - 5546 (dfs搜索)
- HDU5547 Sudoku(深搜DFS)(2015CCPC)