算法训练 黑白无常  
时间限制:1.0s   内存限制:256.0MB
    
问题描述
  某寝室的同学们在学术完之后准备玩一个游戏:游戏是这样的,每个人头上都被贴了一张白色或者黑色的纸,现在每个人都会说一句话“我看到x张白色纸条和y张黑色的纸条”,又已知每个头上贴着白色纸的人说的是真话、每个头上贴着黑色纸的人说的是谎话,现在要求你判断哪些人头上贴着的是白色的纸条,如果无解输出“NoSolution.”;如果有多组解,则把每个答案中贴白条的人的编号按照大小排列后组成一个数(比如第一个人和第三个人头上贴着的是白纸条,那么这个数就是13;如果第6、7、8个人都贴的是白纸条,那么这个数就是678)输出最小的那个数(如果全部都是黑纸条也满足情况的话,那么输出0)
输入格式
  第一行为一个整数n,接下来n行中的第i行有两个整数x和y,分别表示第i个人说“我看到x张白色纸条和y张黑色的纸条”。
输出格式
  一行。如果无解输出“NoSolution.”。否则输出答案中数值(具体见问题描述)最小的那个,如果全部都是黑纸条也满足情况的话,那么输出0
样例输入
2
1 0
1 0
样例输出
0
样例输入
5
3 1
0 4
1 3
4 0
1 3
样例输出
35
数据规模和约定
  n<=8
import java.util.Scanner;
public class Main {
    static int n;
    static int x[]=new int[8];
    static int y[]=new int[8];
    //第i个人的话是否成立  num为人下标  value 为 0白  或者  1黑 
    static int isok(int a[],int num,int value){
        int black=0,white=0,i;
        for(i=0;i<n;i++){
            if(i!=num){
                if(a[i]!=0) black++;  //黑色
                else white++;   //白色
            }
        }
        if(value>0){  //
            if(x[num]==white && y[num]==black) return 0;
            else return 1;
        }
        else {  //
            if(x[num]==white && y[num]==black) return 1;
            else return 0;
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int i,j,k,sign = 0,min=90000000,num;
        int a[]=new int[8];
        int b[]=new int[8];
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        for(i=0;i<n;i++)
        {
            x[i]=sc.nextInt();
            y[i]=sc.nextInt();
            
        }
        for(i=0;i<Math.pow(2,n);i++){
            k=i;
            for(j=0;j<n;j++){
                a[j]=k%2;
                k/=2;
            }
            sign=1;
            for(j=0;j<n;j++){
                if(isok(a,j,a[j])==0){
                    sign=0;
                    break;
                }
            }
            if(sign!=0){
                k=1;
                num=0;
                for(j=n-1;j>=0;j--){
                    if(a[j]==0){
                        num+=k*(j+1);
                        k*=10;
                    }
                }
                if(num<min) min=num;
            }
        }
        if(min==900000000) System.out.println("NoSolution");
        else{
            for(i=0;i<n;i++)
                b[i]=1;
            for(i=0;i<n;i++){
                if(isok(b,i,b[i])==0){
                    sign=0;
                    break;
                }
                
            }
            if(sign==0)  System.out.println(min);
            else System.out.println("0");
        }

    }

}