Sort by

recency

|

24 Discussions

|

  • + 0 comments

    Discover the excitement of Jumping Rooks, a unique and engaging game that challenges your strategic thinking. To enhance your gaming experience, we’re offering a set of promotional pens with every game purchase. These pens are perfect for jotting down your strategies and scores while you enjoy the game. Stay organized and stylish with these branded pens as you immerse yourself in the fun and challenge of Jumping Rooks."

  • + 0 comments

    Here is my solution in java, C, C++ HackerRank Jumping Rooks Problem Solution

  • + 0 comments

    Here is the solution of Jumping Rooks Click Here

  • + 0 comments

    Here is problem solution - https://programs.programmingoneonone.com/2021/07/hackerrank-jumping-rooks-problem-solution.html

  • + 0 comments

    java7

    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.PrintWriter;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.InputMismatchException;
    import java.util.List;
    
    public class C {
    	InputStream is;
    	PrintWriter out;
    	String INPUT = "";
    	
    	void solve()
    	{
    		int n = ni(), K = ni();
    		char[][] map = nm(n,n);
    		int[][] ud = new int[n][n];
    		int[][] lr = new int[n][n];
    		int pud = 0, plr = 0;
    		{
    			int id = -1;
    			for(int i = 0;i < n;i++){
    				char pre = 0;
    				for(int j = 0;j < n;j++){
    					if(map[j][i] == '.'){
    						if(pre != '.')id++; 
    						ud[j][i] = id;
    					}
    					pre = map[j][i];
    				}
    			}
    			pud = id + 1;
    		}
    		{
    			int id = -1;
    			for(int i = 0;i < n;i++){
    				char pre = 0;
    				for(int j = 0;j < n;j++){
    					if(map[i][j] == '.'){
    						if(pre != '.')id++; 
    						lr[i][j] = id;
    					}
    					pre = map[i][j];
    				}
    			}
    			plr = id + 1;
    		}
    		List<Edge> es = new ArrayList<>();
    		for(int i = 0;i < n;i++){
    			for(int j = 0;j < n;j++){
    				if(map[i][j] == '.'){
    					es.add(new Edge(ud[i][j], lr[i][j]+pud, 1, 0));
    				}
    			}
    		}
    		int src = pud + plr, sink = src + 1;
    		for(int i = 0;i < pud;i++){
    			for(int j = 0;j <= n;j++){
    				es.add(new Edge(src, i, 1, j));
    			}
    		}
    		for(int i = 0;i < plr;i++){
    			for(int j = 0;j <= n;j++){
    				es.add(new Edge(i+pud, sink, 1, j));
    			}
    		}
    		out.println(solveMinCostFlow(compileWD(sink+1, es), src, sink, K));
    	}
    	
    	public static class Edge
    	{
    		public int from, to;
    		public int capacity;
    		public int cost;
    		public int flow;
    		public Edge complement;
    		// public int iniflow;
    		
    		public Edge(int from, int to, int capacity, int cost) {
    			this.from = from;
    			this.to = to;
    			this.capacity = capacity;
    			this.cost = cost;
    		}
    	}
    	
    	public static Edge[][] compileWD(int n, List<Edge> edges)
    	{
    		Edge[][] g = new Edge[n][];
    		// cloning
    		for(int i = edges.size()-1;i >= 0;i--){
    			Edge origin = edges.get(i);
    			Edge clone = new Edge(origin.to, origin.from, origin.capacity, -origin.cost);
    			clone.flow = origin.capacity;
    			clone.complement = origin;
    			origin.complement = clone;
    			edges.add(clone);
    		}
    		
    		int[] p = new int[n];
    		for(Edge e : edges)p[e.from]++;
    		for(int i = 0;i < n;i++)g[i] = new Edge[p[i]];
    		for(Edge e : edges)g[e.from][--p[e.from]] = e;
    		return g;
    	}
    
    	// NOT VERIFIED
    	public static Edge[][] compileWU(int n, List<Edge> edges)
    	{
    		Edge[][] g = new Edge[n][];
    		// cloning
    		for(int i = edges.size()-1;i >= 0;i--){
    			Edge origin = edges.get(i);
    			Edge back = new Edge(origin.to, origin.from, origin.capacity, origin.cost);
    			edges.add(back);
    		}
    		for(int i = edges.size()-1;i >= 0;i--){
    			Edge origin = edges.get(i);
    			Edge clone = new Edge(origin.to, origin.from, origin.capacity, -origin.cost);
    			clone.flow = origin.capacity;
    			clone.complement = origin;
    			origin.complement = clone;
    			edges.add(clone);
    		}
    		
    		int[] p = new int[n];
    		for(Edge e : edges)p[e.from]++;
    		for(int i = 0;i < n;i++)g[i] = new Edge[p[i]];
    		for(Edge e : edges)g[e.from][--p[e.from]] = e;
    		return g;
    	}	
    
    	
    	public static long solveMinCostFlow(Edge[][] g, int source, int sink, long all)
    	{
    		int n = g.length;
    		long mincost = 0;
    		int[] potential = new int[n];
    		
    		final int[] d = new int[n];
    		MinHeap q = new MinHeap(n);
    		while(all > 0){
    			// shortest path src->sink
    			Edge[] inedge = new Edge[n];
    			Arrays.fill(d, Integer.MAX_VALUE / 2);
    			d[source] = 0;
    			q.add(source, 0);
    			while(q.size() > 0){
    				int cur = q.argmin();
    				q.remove(cur);
    				for(Edge ne : g[cur]){
    					if(ne.capacity - ne.flow > 0){
    						int nd = d[cur] + ne.cost + potential[cur] - potential[ne.to];
    						if(d[ne.to] > nd){
    							inedge[ne.to] = ne;
    							d[ne.to] = nd;
    							q.update(ne.to, nd);
    						}
    					}
    				}
    			}
    			
    			if(inedge[sink] == null)break;
    			
    			long minflow = all;
    			long sumcost = 0;
    			for(Edge e = inedge[sink];e != null;e = inedge[e.from]){
    				if(e.capacity - e.flow < minflow)minflow = e.capacity - e.flow;
    				sumcost += e.cost;
    			}
    			mincost += minflow * sumcost;
    			for(Edge e = inedge[sink];e != null;e = inedge[e.from]){
    				e.flow += minflow;
    				e.complement.flow -= minflow;
    			}
    			
    			all -= minflow;
    			for(int i = 0;i < n;i++){
    				potential[i] += d[i];
    			}
    		}
    		return mincost;
    	}
    	
    
    	public static class MinHeap {
    		public int[] a;
    		public int[] map;
    		public int[] imap;
    		public int n;
    		public int pos;
    		public static int INF = Integer.MAX_VALUE;
    		
    		public MinHeap(int m)
    		{
    			n = m+2;
    			a = new int[n];
    			map = new int[n];
    			imap = new int[n];
    			Arrays.fill(a, INF);
    			Arrays.fill(map, -1);
    			Arrays.fill(imap, -1);
    			pos = 1;
    		}
    		
    		public int add(int ind, int x)
    		{
    			int ret = imap[ind];
    			if(imap[ind] < 0){
    				a[pos] = x; map[pos] = ind; imap[ind] = pos;
    				pos++;
    				up(pos-1);
    			}
    			return ret != -1 ? a[ret] : x;
    		}
    		
    		public int update(int ind, int x)
    		{
    			int ret = imap[ind];
    			if(imap[ind] < 0){
    				a[pos] = x; map[pos] = ind; imap[ind] = pos;
    				pos++;
    				up(pos-1);
    			}else{
    				int o = a[ret];
    				a[ret] = x;
    				up(ret);
    				down(ret);
    //				if(a[ret] > o){
    //					up(ret);
    //				}else{
    //					down(ret);
    //				}
    			}
    			return x;
    		}
    		
    		public int remove(int ind)
    		{
    			if(pos == 1)return INF;
    			if(imap[ind] == -1)return INF;
    			
    			pos--;
    			int rem = imap[ind];
    			int ret = a[rem];
    			map[rem] = map[pos];
    			imap[map[pos]] = rem;
    			imap[ind] = -1;
    			a[rem] = a[pos];
    			a[pos] = INF;
    			map[pos] = -1;
    			
    			up(rem);
    			down(rem);
    			return ret;
    		}
    		
    		public int min() { return a[1]; }
    		public int argmin() { return map[1]; }
    		public int size() {	return pos-1; }
    		
    		private void up(int cur)
    		{
    			for(int c = cur, p = c>>>1;p >= 1 && a[p] > a[c];c>>>=1, p>>>=1){
    				int d = a[p]; a[p] = a[c]; a[c] = d;
    				int e = imap[map[p]]; imap[map[p]] = imap[map[c]]; imap[map[c]] = e;
    				e = map[p]; map[p] = map[c]; map[c] = e;
    			}
    		}
    		
    		private void down(int cur)
    		{
    			for(int c = cur;2*c < pos;){
    				int b = a[2*c] < a[2*c+1] ? 2*c : 2*c+1;
    				if(a[b] < a[c]){
    					int d = a[c]; a[c] = a[b]; a[b] = d;
    					int e = imap[map[c]]; imap[map[c]] = imap[map[b]]; imap[map[b]] = e;
    					e = map[c]; map[c] = map[b]; map[b] = e;
    					c = b;
    				}else{
    					break;
    				}
    			}
    		}
    	}
    
    	
    	void run() throws Exception
    	{
    		is = INPUT.isEmpty() ? System.in : new ByteArrayInputStream(INPUT.getBytes());
    		out = new PrintWriter(System.out);
    		
    		long s = System.currentTimeMillis();
    		solve();
    		out.flush();
    		if(!INPUT.isEmpty())tr(System.currentTimeMillis()-s+"ms");
    	}
    	
    	public static void main(String[] args) throws Exception { new C().run(); }
    	
    	private byte[] inbuf = new byte[1024];
    	private int lenbuf = 0, ptrbuf = 0;
    	
    	private int readByte()
    	{
    		if(lenbuf == -1)throw new InputMismatchException();
    		if(ptrbuf >= lenbuf){
    			ptrbuf = 0;
    			try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
    			if(lenbuf <= 0)return -1;
    		}
    		return inbuf[ptrbuf++];
    	}
    	
    	private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); }
    	private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; }
    	
    	private double nd() { return Double.parseDouble(ns()); }
    	private char nc() { return (char)skip(); }
    	
    	private String ns()
    	{
    		int b = skip();
    		StringBuilder sb = new StringBuilder();
    		while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ')
    			sb.appendCodePoint(b);
    			b = readByte();
    		}
    		return sb.toString();
    	}
    	
    	private char[] ns(int n)
    	{
    		char[] buf = new char[n];
    		int b = skip(), p = 0;
    		while(p < n && !(isSpaceChar(b))){
    			buf[p++] = (char)b;
    			b = readByte();
    		}
    		return n == p ? buf : Arrays.copyOf(buf, p);
    	}
    	
    	private char[][] nm(int n, int m)
    	{
    		char[][] map = new char[n][];
    		for(int i = 0;i < n;i++)map[i] = ns(m);
    		return map;
    	}
    	
    	private int[] na(int n)
    	{
    		int[] a = new int[n];
    		for(int i = 0;i < n;i++)a[i] = ni();
    		return a;
    	}
    	
    	private int ni()
    	{
    		int num = 0, b;
    		boolean minus = false;
    		while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
    		if(b == '-'){
    			minus = true;
    			b = readByte();
    		}
    		
    		while(true){
    			if(b >= '0' && b <= '9'){
    				num = num * 10 + (b - '0');
    			}else{
    				return minus ? -num : num;
    			}
    			b = readByte();
    		}
    	}
    	
    	private long nl()
    	{
    		long num = 0;
    		int b;
    		boolean minus = false;
    		while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
    		if(b == '-'){
    			minus = true;
    			b = readByte();
    		}
    		
    		while(true){
    			if(b >= '0' && b <= '9'){
    				num = num * 10 + (b - '0');
    			}else{
    				return minus ? -num : num;
    			}
    			b = readByte();
    		}
    	}
    	
    	private static void tr(Object... o) { System.out.println(Arrays.deepToString(o)); }
    }