1 条题解
-
0
C++ :
#include <cstdio> #include <cstring> #include <queue> using namespace std ; int visit[5000000] ; int main() { // freopen("in.txt" , "r" , stdin ) ; int n ; int on[100010] ; while( ~scanf("%d" , &n ) ) { int k ; scanf("%d" , &k ) ; memset( on , 0 , sizeof( on ) ) ; memset( visit , -1 , sizeof( visit ) ) ; for( int i = 0 ; i < k ; i ++ ) { int t ; scanf("%d" , &t ) ; for( int j = 0 ; j < t ; j ++ ) { int m ; scanf("%d" , &m ) ; on[i] = on[i] | ( 1 << m ) ; } } queue<int> q ; q.push(0) ; visit[0] = 0 ; while( !q.empty() ) { int t = q.front() ; q.pop() ; for( int i = 0 ; i < k ;i ++ ) { int tt = t ^ on[i] ; if( visit[tt] == -1 ) { visit[tt] = visit[t] + 1 ; q.push( tt ) ; if(visit[(1<<n)-1] != -1) break ; } } if(visit[(1<<n)-1] != -1) break ; } if( visit[(1<<n)-1] != -1 ) { printf("%d\n" , visit[(1<<n)-1]) ; } else { printf("no solver!\n") ; } } return 0 ; }
Java :
import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Scanner; public class Main { int m,k; int[] B; public Main() { Scanner sc=new Scanner(System.in); //sc.hasNextInt(); while(sc.hasNextInt()) { m=sc.nextInt(); k=sc.nextInt(); int start=(1<<m)-1; B=new int[k]; for(int i=0;i<k;i++) { int zero=0; //000 //001 按钮 翻转0号位 最右边一位 int n=sc.nextInt(); for(int a=0;a<n;a++) { int temp=sc.nextInt(); zero=zero|(1<<temp); //把第temp位上设置为1 } B[i]=zero; //System.out.println(zero); } ArrayList<Node> AL=new ArrayList<Node>(); //队列 Node startnode=new Node(start,0); startnode.Mark='S';//加上开始标记s Node goalnode=new Node(0,0); goalnode.Mark='G'; //加上终止拓展标记G HashMap<Integer,Node> StartSet=new HashMap<Integer,Node>(); StartSet.put(start,startnode);//开始格局 映射到startnode HashMap<Integer,Node> GoalSet=new HashMap<Integer,Node>(); GoalSet.put(0,goalnode);//目标格局 映射到goalnode AL.add(startnode); AL.add(goalnode); //开始状态和目标状态加入队列 int index=0; boolean success=true; while(index<AL.size() && success) { Node current=AL.get(index); if(current.Mark=='S'&&GoalSet.containsKey(current.align)) //判断是否目标状态 { System.out.println(current.step+GoalSet.get(current.align).step); success=false; break; } if(current.Mark=='G'&&StartSet.containsKey(current.align)) //判断是否目标状态 { System.out.println(current.step+StartSet.get(current.align).step); success=false; break; } for(int i=0;i<k;i++) { int newalign=current.align^B[i]; //按下按钮,翻转 if(current.Mark=='S'&&StartSet.containsKey(newalign)==false||current.Mark=='G'&&GoalSet.containsKey(newalign)==false) { Node newstate=new Node(newalign,current.step+1); newstate.Mark=current.Mark; AL.add(newstate); if(newstate.Mark=='S') StartSet.put(newalign,newstate); else GoalSet.put(newalign, newstate); } } index++; } } } public static void main(String[] args) { // TODO Auto-generated method stub Main tk=new Main(); } class Node{ public Node(int a,int s) { align=a;step=s; } int align; //排列 int step; //步数 char Mark;//标记开始拓展 还是 结束拓展 } }
- 1
信息
- ID
- 651
- 时间
- 3000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者