第九届山东理工大学ACM网络编程擂台赛 正式赛 sdut4082 帮“绝艺”数气II
2017-11-22 12:55
302 查看
题目链接
Time Limit: 1000MS
Memory Limit: 65536KB
在此之前,玄黄需要为大家普及一下围棋气的基本知识,棋子落入棋盘上后,便有了气,气是棋子赖以生存的源泉,当棋子的气都被对面棋子占领时,那它就要离开棋盘了。那么棋子的气是什么呢?就是棋子在棋盘上相邻的交叉点。见下图:
中间的那一个棋子有四个相邻的交叉点,因此它有四口气,上边的那一个棋子由于棋盘边界的限制,所以只有三口气,右上角的棋子只有两口气,左下角的两个棋子连在了一起,气是共用的,共有六口气,右下角三个棋子有 7 口气。
围棋的棋盘太大,我们把问题简单化,现在有一个 n*n 的棋盘,我们把棋盘上的空位用 0 表示,把棋盘上有黑棋的位置用 1 表示,把棋盘上有白棋的地方用2表示。现在棋盘上已经有一块黑棋和若干白棋,现在轮到黑棋下子,绝艺想知道他的棋子落到棋盘上后有多少口气。
思路:两种思路,一种是从落子初进行DFS/BFS(搜索),第二种比较简单,是判断落子是否与棋盘上已有棋子连接,如果没有连接就判断落子处四个方向是否有气,否则棋盘上就只有一块黑棋,就可以枚举所有空白处,判断空白处四周是否有黑棋,如果有黑棋,那么它就是黑棋的气
第一种:
第二种
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
今年,腾讯开发的人工智能“绝艺”在世界围棋电圣战中力压群雄,夺得冠军,成为除 alphago 以外的世界最强的围棋 AI。但是,据绝艺内部人员所说,绝艺的弱项是数气。数气是围棋当中一项简单而又重要的任务,你能帮助绝艺完成这项任务吗?在此之前,玄黄需要为大家普及一下围棋气的基本知识,棋子落入棋盘上后,便有了气,气是棋子赖以生存的源泉,当棋子的气都被对面棋子占领时,那它就要离开棋盘了。那么棋子的气是什么呢?就是棋子在棋盘上相邻的交叉点。见下图:
中间的那一个棋子有四个相邻的交叉点,因此它有四口气,上边的那一个棋子由于棋盘边界的限制,所以只有三口气,右上角的棋子只有两口气,左下角的两个棋子连在了一起,气是共用的,共有六口气,右下角三个棋子有 7 口气。
围棋的棋盘太大,我们把问题简单化,现在有一个 n*n 的棋盘,我们把棋盘上的空位用 0 表示,把棋盘上有黑棋的位置用 1 表示,把棋盘上有白棋的地方用2表示。现在棋盘上已经有一块黑棋和若干白棋,现在轮到黑棋下子,绝艺想知道他的棋子落到棋盘上后有多少口气。
Input
输入数据有多组。每组数据第一行输入一个整数 n (2 < n < 20),接下来有 n 行, 0 表示棋盘上空位,1表示棋盘上黑棋的位置,2表示棋盘上白棋的位置,输入保证有且仅有一块黑棋,且这块黑棋和若干白棋都至少有 1 口气,接下来输入x和y(1<=x,y<=n),表示绝艺落子的坐标,输入保证绝艺落子有效且不会让棋盘上的白棋变成0口气。详情见示例输入。Output
对于每组输入,输出一个整数,表示刚刚落子位置的棋有多少口气。Example Input
3 2 0 0 2 1 0 0 2 2 3 1 3 0 0 0 2 1 0 0 1 2 1 3 3 0 1 0 0 1 1 0 0 1 2 1
Example Output
0 2 4
Author
玄黄思路:两种思路,一种是从落子初进行DFS/BFS(搜索),第二种比较简单,是判断落子是否与棋盘上已有棋子连接,如果没有连接就判断落子处四个方向是否有气,否则棋盘上就只有一块黑棋,就可以枚举所有空白处,判断空白处四周是否有黑棋,如果有黑棋,那么它就是黑棋的气
第一种:
#include<stdio.h> int i,n,s[50][50],x,y,j; int dx[] = {-1,1,0,0}; int dy[] = {0,0,1,-1}; int dfs(int x,int y) { int i,xx,yy,num = 0; if(s[x][y] == 0) {s[x][y] = 2;return 1;} s[x][y] = 2; for(i = 0;i < 4;i ++) { xx = x+dx[i]; yy = y+dy[i]; if(s[xx][yy] == 2) continue; num += dfs(xx,yy); } return num; } int main() { while(~scanf("%d",&n)) { for(i = 0;i <= 49;i ++) for(j = 0;j <= 49;j ++) s[i][j] = 2; for(i = 1;i <= n;i ++) for(j = 1;j <= n;j ++) scanf("%d",&s[i][j]); scanf("%d%d",&x,&y); s[x][y] = 2; printf("%d\n",dfs(x,y)); } return 0; }
第二种
#include <stdio.h> int n; int data[50][50]; int dx[]={1,-1,0,0}; int dy[]={0,0,1,-1}; int check(int x, int y, int v) { for (int i = 0; i < 4; i++) { int xx = x + dx[i]; int yy = y + dy[i]; if (xx < 0 || xx >= n || yy < 0 || yy >= n) continue; if (data[xx][yy] == v) return 1; } return 0; } int main() { while (~scanf("%d", &n)) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d", &data[i][j]); } } int x, y; scanf("%d %d", &x, &y); x--, y--; data[x][y] = 1; int ans = 0; if (check(x, y, 1)) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (data[i][j]) continue; if (check(i, j, 1)) ans++; } } } else { for (int i = 0; i < 4; i++) { int xx = x + dirc[i][0]; int yy = y + dirc[i][1]; if (xx < 0 || xx >= n || yy < 0 || yy >= n) continue; if (data[xx][yy] == 0) ans++; } } printf("%d\n", ans); } }
相关文章推荐
- 第九届山东理工大学ACM网络编程擂台赛 正式赛 sdut4080 UMR's dress
- 第九届山东理工大学ACM网络编程擂台赛 正式赛 sdut4075GCD - ldq的黑心啤酒厂
- 第九届山东理工大学ACM网络编程擂台赛 F题题解
- 第五届山东理工大学ACM网络编程擂台赛
- ACM学习历程—NPU 2015年陕西省程序设计竞赛网络预赛(正式赛)F题 和谐的比赛(递推)
- 『NYIST』第九届河南省ACM竞赛队伍选拔赛[正式赛二]--Codeforces -35D. Animals
- 『NYIST』第九届河南省ACM竞赛队伍选拔赛[正式赛二]- Nearly Lucky Number(Codeforces Beta Round #84 (Div. 2 Only)A. Nearly)
- 师创杯”山东理工大学第九届ACM程序设计竞赛(网络同步赛)--I皮卡丘的梦想2
- “师创杯”SDUT-ACM校赛正式赛-C~K玩游戏
- “师创杯”山东理工大学第九届ACM程序设计竞赛 正式赛 G.打字【Dp+贪心】水题
- “师创杯”山东理工大学第九届ACM程序设计竞赛 正式赛 F.校赛~校赛~【思维+规律题】
- 『NYIST』第九届河南省ACM竞赛队伍选拔赛[正式赛二]-最小内积(第八届北京师范大学程序设计竞赛决赛)
- sdut 第三届ACM/ICPC程序设计知识竞赛网络赛 字符串拓展
- “师创杯”SDUT-ACM校赛正式赛-从零开始的异世界生活
- 第九届ACM趣味程序设计竞赛第二场(正式赛) B - 绿帽自动机【思维】
- “师创杯”山东理工大学第九届ACM程序设计竞赛 正式赛 I.皮卡丘的梦想2【树状数组】水题
- “师创杯”山东理工大学第九届ACM程序设计竞赛 正式赛【9/10】
- ACM学习历程—NPU 2015年陕西省程序设计竞赛网络预赛(正式赛)A题 小女警的异世界之战(dfs && 分治)
- ACM学习历程—NPU1086 随机数 2015年陕西省程序设计竞赛网络预赛(正式赛)C题 (计数排序 || set容器)
- ACM学习历程—NPU 2015年陕西省程序设计竞赛网络预赛(正式赛)E题 简单题(同余 && 快速幂)