hdu 1760 DFS+博弈

0代表可放 1带表不能放 每次放一个2*2的方块 不能放者败
如果先手必胜则输出Yes

必胜态:从当前状态所能到达的状态中存在一个必败态
必败态:从当前状态所能达到的状态全部是必胜态

Sample Input
4 4
0000
0000
0000
0000
4 4
0000
0010
0100
0000

Sample Output
Yes
No

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 # include <string>
 6 # include <cmath>
 7 # include <queue>
 8 # include <list>
 9 # define LL long long
10 using namespace std ;
11
12 char str[50][50];
13 int p[50][50];
14 int n,m;
15 int dfs()
16 {
17     int i,j,flag;
18     flag = 0;
19     for(i = 0;i < n-1;i ++)
20     {
21         for(j = 0;j < m-1;j ++)
22         {
23             if(p[i][j] == 0&&p[i+1][j] == 0&&p[i][j+1] == 0&&p[i+1][j+1] == 0)
24             {
25                 p[i][j] = p[i+1][j] = p[i][j+1] = p[i+1][j+1] = 1;
26                 if(dfs() == 0) //子状态存在必败态
27                 flag = 1;
28                 p[i][j] = p[i+1][j] = p[i][j+1] = p[i+1][j+1] = 0;
29             }
30         }
31     }
32     if(flag)
33     return 1;
34     else
35     return 0;
36 }
37 int main()
38 {
39     int i,j;
40     while(scanf("%d%d",&n,&m)!=EOF)
41     {
42         for(i = 0; i < n; i ++)
43             scanf("%s",str[i]);
44         for(i = 0; i < n; i ++)
45         {
46             for(j = 0; j < m; j ++)
47             {
48                 if(str[i][j] == ‘0‘)
49                 p[i][j] = 0;
50                 else
51                 p[i][j] = 1;
52             }
53         }
54         if(dfs())
55         printf("Yes\n");
56         else
57         printf("No\n");
58     }
59     return 0;
60 }

时间: 2024-10-11 06:56:58

hdu 1760 DFS+博弈的相关文章

hdu 3032(博弈sg函数)

题意:与原来基本的尼姆博弈不同的是,可以将一堆石子分成两堆石子也算一步操作,其它的都是一样的. 分析:由于石子的堆数和每一堆石子的数量都很大,所以肯定不能用搜索去求sg函数,现在我们只能通过找规律的办法求得sg的规律. 通过打表找规律可以得到如下规律:if(x%4==0) sg[x]=x-1; if(x%4==1||x%4==2) sg[x]=x; if(x%4==3) sg[x] = x+1. 打表代码: #include<iostream> #include<cstdio> #

hdu 4109 dfs+剪枝优化

求最久时间即在无环有向图里求最远路径 dfs+剪枝优化 从0节点(自己增加的)出发,0到1~n个节点之间的距离为1,mt[i]表示从0点到第i个节点目前所得的最长路径 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<vector> using namespace std; const

HDU 1015 dfs回溯

题目真长.....看了好长时间才看懂.. 就是给你一个32位数字和一个最多15个字符的字符串,从字符串中选出5个字符,若满足题中给的那个式子,输出字典序最大的那5个字符,若不满足,输出no solution. 为了解决字典序问题,在输入字符串后,把字符串按从大到小排一下序,搜索一下若满足条件输出即可. 贴代码. 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <

hdu 1312 DFS算法简单题

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 此题与油田那题很像是练习深搜的好题,题意是从"@"开始,遍历整个图,找到连接的 "."有多少个 但要考虑变化,简单处理下就行了,主要是斜角的不要了,而且判断结束方式也不一样 具体看代码吧 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

hdu 1760

A New Tetris Game Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1130    Accepted Submission(s): 533 Problem Description 曾经,Lele和他姐姐最喜欢,玩得最久的游戏就是俄罗斯方块(Tetris)了.渐渐得,Lele发觉,玩这个游戏只需要手快而已,几乎不用经过大脑思

HDU 5143 DFS

分别给出1,2,3,4   a, b, c,d个 问能否组成数个长度不小于3的等差数列. 首先数量存在大于3的可以直接拿掉,那么可以先判是否都是0或大于3的 然后直接DFS就行了,但是还是要注意先判合法能否进入下层递归来减少内存消耗. /** @Date : 2017-09-27 15:08:23 * @FileName: HDU 5143 DFS.cpp * @Platform: Windows * @Author : Lweleth ([email protected]) * @Link :

HDU 1045 DFS暴搜

Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6229    Accepted Submission(s): 3506 Problem Description Suppose that we have a square city with straight streets. A map of a city is a s

hdu 2212 DFS(水题)

DFS Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4923    Accepted Submission(s): 3029 Problem Description A DFS(digital factorial sum) number is found by summing the factorial of every digit

hdu 1760 A New Tetris Game 博弈~~搜索求sg函数

A New Tetris Game Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1176    Accepted Submission(s): 557 Problem Description 曾经,Lele和他姐姐最喜欢,玩得最久的游戏就是俄罗斯方块(Tetris)了. 渐渐得,Lele发觉,玩这个游戏只需要手快而已,几乎不用经过大