poj1970 The Game(DFS)
题目链接
http://poj.org/problem?id=1970
思路
题目的意思是判断五子棋棋局是否有胜者,有的话输出胜者的棋子类型,并且输出五个棋子中最左上的棋子坐标;没有胜者输出0.
这道题目是floodfill延伸而来,使用dfs求解,但这道题比普通的floodfill题目又多了一些难度,比如要输出最左上棋子的坐标,我的做法是在main函数中从上到下、从左到右遍历棋盘,当位置(r, c)有棋子时,则从该位置开始dfs,加上搜索的方向为向右(r, c+1),向下(r+1, c),右下(r+1, c+1),右上(r, c-1),所以如果搜索的结果符合获胜的条件,则(r, c)就为最左上的位置。普通dfs题目标记是否搜索过时大多使用二维数据visit[i][j],在该题中,除了坐标之外,还要加上方向vist[i][j][d],表示在坐标(i, j)的d方向是否搜索过。
代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 19;
int board[N+1][N+1];
int visit[N+1][N+1][4];
int dir[4][2] = {{-1, 1}, {0, 1}, {1, 1}, {1, 0}}; //方向为右上、右、右下、下
int cnt;
void dfs(int r, int c, int d, int type){
visit[r][c][d] = 1;
int nr = r + dir[d][0];
int nc = c + dir[d][1];
if(nr>=0 && nr<N && nc>=0 && nc<N && board[nr][nc]==type){ //注意这里不需要条件 && !visit[nr][nc][d]
cnt++;
dfs(nr, nc, d, type);
}
}
int main(){
//freopen("poj1970.txt", "r", stdin);
int t;
cin>>t;
while(t--){
memset(board, 0, sizeof(board));
memset(visit, 0, sizeof(visit));
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
scanf("%d", &board[i][j]);
}
}
bool win = false;
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
if(board[i][j]){
int type = board[i][j];
for(int k=0; k<4; k++){
if(!visit[i][j][k]){
cnt = 1;
dfs(i, j, k, type);
if(cnt==5 && board[i-dir[k][0]][j-dir[k][1]]!=board[i][j]){ //排除6子连珠的情况
win = true;
printf("%d\n%d %d\n", type, i+1, j+1);
}
}
if(win) break;
}
}
if(win) break;
}
if(win) break;
}
if(!win){
cout<<"0"<<endl;
}
}
return 0;
}
poj1970 The Game(DFS)的更多相关文章
- 【POJ - 1970】The Game(dfs)
-->The Game 直接中文 Descriptions: 判断五子棋棋局是否有胜者,有的话输出胜者的棋子类型,并且输出五个棋子中最左上的棋子坐标:没有胜者输出0.棋盘是这样的,如图 Samp ...
- BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 1280 MBSubmit: 3127 Solved: 795[Submit][Status][Discu ...
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2221 Solved: 1179[Submit][Sta ...
- BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1352 Solved: 780[Submit][Stat ...
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- POJ_2386 Lake Counting (dfs 错了一个负号找了一上午)
来之不易的2017第一发ac http://poj.org/problem?id=2386 Lake Counting Time Limit: 1000MS Memory Limit: 65536 ...
- 深度优先搜索(DFS)
[算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
随机推荐
- Java并发编程原理与实战二十七:循环栅栏:CyclicBarrier
昨天我们学习了倒计数功能的等待,今天我们学习的是循环栅栏:CyclicBarrier.下面我们就开始吧: 1.CyclicBarrier简介CyclicBarrier,是JDK1.5的java.uti ...
- ASP.NET 数据库缓存依赖
By Peter A. Bromberg, Ph.D. 在ASP.NET中,Cache类最酷的特点是它能根据各种依赖来良好的控制自己的行为.以文件为基础的依赖是最有用的,文件依赖项是通过使用 Cach ...
- github 新创建repositories
1. 在github上新建repo 2. 找到改repo的地址,用命令git clone https://...., 拉取到本地 3. 打开一个单独的窗口,打开此文件夹 4. 创建自己的python ...
- 20155212 2016-2017-2《Java程序设计》课程总结
每周博客 每周作业链接汇总 预备作业一:专业理解.未来展望.期望的师生关系. 预备作业二:HOMEWORK-2 预备作业三:HOMEWORK-3 第一周作业:学习教材Chapter 1 Java平台概 ...
- Python练习-不知道弄个什么鬼
Alex大神,今天丢过来一个PDF,结果就成了这个样子! 1. 执行 Python 脚本的两种方式 交互方式: 命令行 文件方式: ...
- nginx配置浅析
一.nginx的介绍 nginx是由俄罗斯人开发的一款高性能的http和反向代理服务器,也可以用来作为邮件代理.相比较于其他的服务器,具有占用内存少,稳定性高等优势 二.nginx的配置 nginx的 ...
- Linux USB驱动框架分析 【转】
转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...
- SQL语句帮助大全
--删除约束 Status:字段名 alter table Table_1 drop constraint Status; --添加约束 --Status :字段名 t_Pay_Order:表名 默认 ...
- lombok java代码助手
是不一个不错的代码生成工具,可以实现将代码更精简,且不失代码效率的一种不错的方法 https://www.cnblogs.com/qnight/p/8997493.html 通过java bean v ...
- if(a==1) & if(1==a) 区别
[前提] 在公司参加项目时,看到前辈写if比较数值是否相等,经常会写 if(1==a) ,觉得有些奇怪,如是乎,将调查结果写下来记录一下. [结果] if(a==1) 与 if(1==a)是没有什么区 ...