zoukankan      html  css  js  c++  java
  • P2730 魔板 Magic Squares (搜索)

    题目链接


    Solution

    这道题,我是用 (map) 做的.
    具体实现,我们用一个 (string) 类型表示任意一种情况.
    可以知道,排列最多只有 (8!) 个.
    然后就是直接的广搜了.直接用初始串去操作即可.
    关于字典序,我们直接按 (ABC) 启用操作即可.

    Code

    /*
    Problem: 2730
    Time: Day -95
    */
    #include<bits/stdc++.h>
    using namespace std;
    map <string,string> kkk;
    map <string,int> v;
    map <string,int> vis;
    queue<string>q;
    string ans;
    
    void output(string s)
    {
    	string fuck=kkk[s];
    	int len=fuck.length();
    	cout<<len<<endl;
    	for(int i=0;i<len;i++)
    	cout<<fuck[i];
    }
    
    void bfs()
    {
    	string s="12345678";
    	q.push(s);
    	kkk[s];
    	vis[s]=1;
    	while(q.empty()!=1)
    	{
    		string now=q.front();
    		q.pop();
    		if(now==ans){output(now);exit(0);}
    		for(int i=1;i<=3;i++)
    		{
    			string tt=now;
    			if(i==1)
    			{	
    				for(int j=0;j<4;j++)
    				swap(tt[j],tt[8-j-1]);
    				if(!vis[tt])
    				{
    					kkk[tt]=kkk[now]+'A',v[tt]=1;
    					q.push(tt),vis[tt]=1;
    				}
    			}
    			if(i==2)
    			{
    				tt[0]=now[3]; tt[7]=now[4];
    				tt[1]=now[0]; tt[2]=now[1]; tt[3]=now[2];
    				tt[4]=now[5]; tt[5]=now[6];	tt[6]=now[7];
    				if(!vis[tt])
    				{
    					kkk[tt]=kkk[now]+'B',v[tt]=1;
    					q.push(tt),vis[tt]=1;
    				}
    			}
    			if(i==3)
    			{
    				tt[1]=now[6]; tt[2]=now[1];
    				tt[5]=now[2]; tt[6]=now[5];
    				if(!vis[tt])
    				{
    					kkk[tt]=kkk[now]+'C',v[tt]=1;
    					q.push(tt),vis[tt]=1;
    				}
    			}
    		}
    	}
    }
    
    int main()
    {
    	int a[10];
    	for(int i=0;i<8;i++)
    	cin>>a[i],ans+=('0'+a[i]);
    	bfs();
    	return 0;
    }
    
  • 相关阅读:
    opensuse字符和图形界面
    Eclipse编辑器小手段
    切换运行时用户以及用户组
    PHP安装和配置
    Linux程序资源限制简述
    test2234343
    找回Svn和Git不见的文件图标
    SourceInsight使用技巧
    Javascript数组使用方法
    MySQL安装和配置
  • 原文地址:https://www.cnblogs.com/Kv-Stalin/p/9436920.html
Copyright © 2011-2022 走看看