• [NOIP1999]进制位(搜索)


    P1013 进制位

    题目描述

    著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字。 例如:

    +    L    K    V    E
    L    L    K    V    E
    K    K    V    E    KL
    V    V    E    KL    KK
    E    E    KL    KK     KV
    

    其含义为:

    L+L=L , L+K=K , L+V=V , L+E=E

    K+L=K , K+K=V , K+V=E , K+E=KL

    …… E+E=KV

    根据这些规则可推导出: L=0 , K=1 , V=2 , E=3

    同时可以确定该表表示的是4进制加法

    //感谢lxy123456同学为本题新加一组数据

    输入输出格式

    输入格式:

    n (n≤9) 表示行数。

    以下 n 行,每行包括 n 个字符串,每个字串间用空格隔开。(字串仅有一个为‘+’号,其它都由大写字母组成)

    输出格式:

    ① 各个字母表示什么数,格式如: L=0 , K=1 ,……按给出的字母顺序。

    ② 加法运算是几进制的。

    ③ 若不可能组成加法表,则应输出“ERROR!”

    输入输出样例

    输入样例#1: 复制

    5

    • L K V E
      L L K V E
      K K V E KL
      V V E KL KK
      E E KL KK KV

    输出样例#1: 复制

    L=0 K=1 V=2 E=3
    4


    题解

    咕咕咕,打打信心题(其实主要是X谷题解没看懂就自己做了)
    根据性质做题目

    1. 0到n-2一定出现过。
    2. 进制一定是n-1位的
      伪证
      我要进位啊
      仔细想想是不是要有1(前提有0),有1就会有2 and so on.
      于是枚举全排列加进制转换就OK了,没什么好讲的。

    代码

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,vis[11],vi[27];
    char s[11][11][11];
    int turn(int x,int y){
    	int ans=0,len=strlen(s[x][y]);
    	for(int i=0;i<len;i++){
    		ans=ans*(n-1)+vi[s[x][y][i]-'A'];
    		//if(x==3&&y==5)cout<<s[x][y][i]<<' ';
    	}
    	//if(x==3&&y==5)cout<<endl;
    	return ans;
    }
    
    bool judge()
    {
    	for(int i=2;i<=n;i++)
    	{
    		for(int j=2;j<=n;j++)
    		{
    			if(i==j&&i==1)continue;
    			int v1=vi[s[1][i][0]-'A']+vi[s[j][1][0]-'A'],v2=turn(i,j);
    			if(v1!=v2){/*cout<<v1<<' '<<v2<<' '<<s[1][i][0]<<' '<<s[j][1][0]<<endl;*/return false;}
    		}
    	}
    	return true;
    }
    
    void dfs(int step){
    	if(step==n+1){
    	//	cout<<"Orz"<<endl;
    		if(judge())
    		{
    			for(int i=2;i<=n;i++)
    			cout<<s[1][i]<<'='<<vi[s[1][i][0]-'A']<<' ';
    			cout<<endl<<n-1<<endl;
    			exit(0);
    		}
    	/*	for(int i=2;i<=n;i++)
    		cout<<s[1][i][0]<<'='<<vi[s[1][i][0]-'A']<<' ';
    		cout<<endl;*/
    	}
    	for(int i=0;i<n-1;i++)
    	if(vis[i]==-1)vis[i]=1,vi[s[1][step][0]-'A']=i,dfs(step+1),vis[i]=-1;
    }
    
    int main()
    {
    	cin>>n;
    	memset(vis,-1,sizeof(vis));
    //	cout<<vis[0]<<endl;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++){
    		scanf("%s",s[i][j]);	
    		//if(strlen(s[i][j])==2)vi[s[i][j][1]-'A']=1; 
    	}
    	dfs(2);
    	printf("ERROR!
    ");
    	return 0;
    }
    
  • 相关阅读:
    Python连接MySQL数据库之pymysql模块使用
    线程
    进程
    网络编程
    面向对象进阶
    迭代器,生成器,装饰器
    函数的基础
    Andy's First Dictionary UVA
    Stripies POJ
    Soldier and Badges CodeForces
  • 原文地址:https://www.cnblogs.com/hhh1109/p/9338652.html
Copyright © 2020-2023  润新知