哈理工OJ P2320:OX

news/2024/11/24 4:51:59/

题目链接:OX

 

题意 :给出一个3X3的黑白棋棋盘,棋盘上有若干黑白子,再给出下一个下的人,问下一个下的人能否赢

 

分析:考虑到只有39种状态,故用一个数保存目前棋盘的状态,记为value,再枚举空位DFS,每次

DFS先判该状态是否已到达(剪枝),再拆分状态用c[3][3]储存,判断是否有赢的状态,最后遍历

棋盘寻找空位,若有则下,value储存状态,再DFS下去,注意返回c[i][j]清零

判断胜负平的条件如下:

  若有一个状态可以到达必败点,则该点必胜,返回1

  若有一个状态可以到达平局点,则该点平局,返回-1

  否则必败,返回0

详情见代码

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn=1e5+10;
 6 int t,dp[maxn][3],st;
 7 char s[3];
 8 
 9 int dfs(int value,int st)
10 {
11     if(dp[value][st]!=-2) return dp[value][st];
12     int c[3][3],sum=0,n1=0,n2=0;//memset(c,0,sizeof(c));
13     for(int i=0;i<3;++i)for(int j=0;j<3;++j)
14     {
15         c[i][j]=value%3;value/=3;
16         if(c[i][j]) sum++;
17     }
18     for(int i=0;i<3;++i)
19     {
20         if(c[i][0]==c[i][1]&&c[i][1]==c[i][2]) if(c[i][0]==1) n1=1;else if(c[i][0]==2) n2=1;
21         if(c[0][i]==c[1][i]&&c[1][i]==c[2][i]) if(c[0][i]==1) n1=1;else if(c[0][i]==2) n2=1;
22     }
23     if(c[0][0]==c[1][1]&&c[1][1]==c[2][2]) if(c[1][1]==1) n1=1;else if(c[1][1]==2) n2=1;
24     if(c[0][2]==c[1][1]&&c[1][1]==c[2][0]) if(c[1][1]==1) n1=1;else if(c[1][1]==2) n2=1;
25     if(n1&&st==1) return 1;
26     if(n2&&st==1) return 0;
27     if(n1&&st==2) return 0;
28     if(n2&&st==2) return 1;
29     if(sum==9) return -1;
30     int judge=0;
31     for(int i=0;i<3;++i)for(int j=0;j<3;++j) if(c[i][j]) continue;
32     else
33     {
34         int value=0;
35         c[i][j]=st;
36         for(int p=0;p<3;++p)for(int k=0;k<3;++k) value=value*3+c[p][k];
37         c[i][j]=0;//很重要,返回时清0
38         int ans=dfs(value,3-st);
39         if(ans==0) return 1;//可以到达必败点的为必胜点
40         if(ans==-1) judge=1;//可以到达平局的状态返回平局
41     }
42     if(judge) return -1;else return 0;//否则返回必败点
43 }
44 int main()
45 {
46     for(scanf("%d",&t);t--;)
47     {
48         for(int i=0;i<maxn;++i)for(int j=0;j<3;++j) dp[i][j]=-2;
49         int value=0;
50         for(int i=0;i<3;++i)for(int j=0;j<3;++j)
51         {
52             scanf("%s",s);
53             if(s[0]=='o') value=value*3+2;
54             else if(s[0]=='x') value=value*3+1;
55             else value=value*3;
56         }
57         scanf("%s",s);
58         if(s[0]=='x') st=1;else st=2;
59         int ans=dfs(value,st);
60         if(ans==0) printf("%c win!\n",st==1?'o':'x');
61         else if(ans==1) printf("%c win!\n",st==2?'o':'x');
62         else puts("tie!");
63     }
64 }
View Code

 

转载于:https://www.cnblogs.com/chendl111/p/6188687.html


http://www.ppmy.cn/news/139337.html

相关文章

Citrix Receiver 错误编号2320

Citrix Receiver 错误编号2320 安装完citrix receiver后点击快捷方式启动应用&#xff0c;出现以上报错解决方法&#xff1a;1 打开注册表 搜索 allowhotkey2 删除allowhotkey键值 注意&#xff0c;删除前请备份该键值&#xff01; 转载于:https://blog.51cto.com/141686/21210…

【实战】烂泥:关于佳能IR2320N网络打印机的安装域使用

第一步&#xff1a;首先要为该机器设置一个IP地址&#xff0c;具体方法是&#xff1a;附加管理→系统管理→网络管理→IPv4→IP地址&#xff0c;输入相应的IP地址&#xff0c;子网掩码&#xff0c;默认网关。如果你要查看该机的MAC地址的话&#xff0c;那你也可以在此查看呢。选…

AHT20温湿度传感器STM32-I2C驱动,替代DHT11/DHT12/AM2320/SHT20/SHT30,IIC代码兼容AHT10/15-MEMS温湿度传感器

AHT20是国内奥松生成的I2C接口的MEMS温湿度传感器&#xff0c;ADC位数为20Bit&#xff0c;具有体积小、精度高、成本低等优点。相较于AHT10&#xff0c;最显著的变化是体积由 5*4*1.6mm&#xff0c;缩小到 3*3*1.0mm。相对湿度精度 RH2%&#xff0c;温度精度 T0.3C。相对湿度测…

ZOJ 2320 Cracking' RSA

其次布尔线性方程组&#xff0c;高斯消元。这道题目的关键部分是看的神牛watashi的思路。另附上watashi的思路 我把他的java模板翻译成了C的了。。。存起来以后当模板用。。。a[i][j]表示第i个数含有质数p[j]的个数&#xff0c;奇数个的话就是true&#xff0c;偶数个就是false。…

STM32 AM2320 温湿度万年历 微信小程序显示及控制

功能描述: 使用STM32F103R8T6&#xff0c;红外遥控器&#xff0c;数码管&#xff0c;串口&#xff0c;预留ADC&#xff08;4~20mA输入、0~10V输入&#xff09;、485、以太网、WiFi、SD卡、USB_OTG等功能。单总线的方式采集温湿度&#xff08;因整个系统时序要求&#xff0c;所…

STM32单片机软件模拟I2C读取AM2320温湿度传感器数据

STM32单片机使用软件模拟IIC读取AM2320温湿度传感器的数据并显示在0.96寸OLED屏上。 我用的单片机是STM32F103C8T6&#xff0c;程序用的是ST标准库写的。 STM32使用硬件I2C读取SHTC3温湿度传感器&#xff1a;https://blog.zeruns.tech/archives/692.html STM32单片机读取AHT1…

bzoj2320: 最多重复子串

2320: 最多重复子串 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 246 Solved: 66[Submit][Status][Discuss] Description 一个字符串P的重复数定义为最大的整数R&#xff0c;使得P可以分为R段连续且相同的子串。比方说&#xff0c;“ababab”的重复数为3&#xff0c;“a…