zoukankan      html  css  js  c++  java
  • CCF CSP 201803-4 棋局评估

    思路:

    1.基本思想就是暴力,枚举每一种可能情况,利用决策树进行对抗搜索;
    2.Alice搜索时,选取所有返回值里最大的那个,Bob相反;
    3.也可以用记忆化搜索进行优化,我用的string保存棋盘,用unordered_map<string,int>保存每一次结果即可;
    4.这题用getchar就翻车 = = ,本地调试都过了提交一分都没有,说明后台压根没按题目上给的格式来测试。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    string s;
    int over(){
    	char flag='0';
    	for(int i=0;i<=2;i++){
    		if(s[i*3]==s[i*3+1]&&s[i*3]==s[i*3+2]&&s[i*3]!='0') flag=s[i*3];
    		if(s[i]==s[i+3]&&s[i]==s[i+6]&&s[i]!='0') flag=s[i];
    	}
    	if((s[0]==s[4]&&s[0]==s[8])||(s[2]==s[4]&&s[2]==s[6])){
    		if(s[4]!='0') flag=s[4];
    	}
    	return flag-'0';
    }
    int score(){
    	int ans=1;
    	for(auto e:s) if(e=='0') ans++;
    	return ans;//统计分数 
    }
    int dfs(bool Alice){
    	int flag=over();
    	if(flag==1) return score();
    	else if(flag==2) return -1*score();
    	int ans=-1;
    	bool is_first=true;
    	for(int i=0;i<s.length();i++){
    		if(s[i]=='0'){
    			s[i]=Alice?'1':'2';
    			if(is_first) ans=dfs(!Alice);
    			else ans=Alice?max(ans,dfs(false)):min(ans,dfs(true));
    			s[i]='0';
    			is_first=false;
    		}
    	}
    	return ans;//如果放满了,返回-1 
    }
    int main(){
    	int t;
    	cin>>t;
    //	getchar();
    	while(t--){
    		s="";		
    //		for(int i=0;i<9;i++) s+=getchar(),getchar();
    		for(int i=0;i<9;i++){
    			int num;
    			cin>>num;
    			s+=to_string(num);
    		}
    		int sc=dfs(true);
    		if(~sc) cout<<sc<<'
    ';
    		else cout<<0<<'
    ';
    	}
    	return 0;
    }
    
  • 相关阅读:
    Linux
    SpringData JPA复合主键
    SpringData JPA实现CRUD,分页与多参数排序
    springboot自定义配置文件
    drools入门示例
    Java 自定义注解与注解解析实例
    GitHub创建项目,保存代码。
    SpringAOP的应用实例与总结
    springmvc与fastjson的整合,注解@RequestBody的使用
    graphviz画图与中文乱码等问题总结
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308892.html
Copyright © 2011-2022 走看看