Cannon
Time limit:2000/1000 MS (java/others) Memory limit:65535/65535 K (java/others)
Total submission (s): 965 Accepted Submission (s): 556
Problem DescriptionIn Chinese Chess, there is one kind of powerful chessmen called Cannon. It can move horizontally or vertically along the chess grid. At each move, it can either simply move to another empty cell in the same line without any other Chessman along the route Or perform an eat action. The Eat action, however, is the main concern in this problem.
An eat action, for example, Cannon A eating Chessman B, requires both conditions:
1, A and B are in either the same row or the same column in the chess grid.
2, there is exactly one chessman between A and B.
Here comes the problem.
Given an N x M chess grid, with some existing chessmen on it, you need put maximum cannon pieces into the grid, satisfying That any of the cannons is not able to eat. It's worth nothing so we only have account the cannon pieces your put in the grid, and no, and no, pieces shares the same cell.
InputThere is multiple test cases.
In all test case, there is three positive integers N, M and Q (1<= N, m<=5, 0<=q <= n x M) in the first line , indicating the row number, column number of the grid, and the number of the existing chessmen.
In the second line, there is Q pairs of integers. Each pair of integers X, Y indicates the row index and the column index of the piece. Row indexes is numbered from 0 to N-1, and column indexes is numbered from 0 to M-1. It guarantees no pieces share the same cell.
OutputThere is a one line for each test case, containing the maximum number of cannons.
Sample INPUT4 4 1 1 5 + 0 1 0 1 1 2 0 2 3 3 1 3 2 4 0 Sample Output89Title Link: http://acm.hdu.edu.cn/showproblem.php?pid=4499
Test instructions: In the chess board of NXM, there is a chess piece with Q, they can not eat each other. Now to add a piece "Cannon" on the board, ask the maximum number of guns can be increased so that the cannon can not eat each other (1<= N, m<=5, 0<=q <= n x M). Cannon a The rule of eating chess B is that A and b have a pawn between a and B in one row or a column.
ideas: N and m very small, direct violence BFS search. Note that cannon can increase the rules. Code:
#include <iostream>#include<cstdio>#include<cstring>using namespacestd;intn,m;intans=0;intedge[Ten][Ten];intDfsintXintYintcou) { intI,j,t,sign,ok;/*For (i=0, i<n; i++) {for (j=0; j<m; j + +) cout<<edge[i][j]<< ""; cout<<endl; } cout<<endl;*/ if(Cou>ans) ans=cou; Edge[x][y]=2; /** The current row can be increased*/ for(j=y+1; j<n; J + +) { if(edge[x][j]==1)Continue; Sign=0; OK=1; for(t=j-1; t>=0; t--) { if(edge[x][t]!=0) sign++; if(sign==2&&edge[x][t]==2) {OK=0; Break; } } if(ok==1) { sign=0; for(t=x-1; t>=0; t--) { if(edge[t][j]!=0) sign++; if(sign==2&&edge[t][j]==2) {OK=0; Break; } } if(ok==1) {Edge[x][j]=2; DFS (X,j,cou+1); EDGE[X][J]=0; } } } /** The current line cannot be added, add the following line*/ for(i=x+1; i<n; i++) { for(j=0; j<m; J + +) { if(edge[i][j]==1)Continue; Sign=0; OK=1; for(t=i-1; t>=0; t--) { if(edge[t][j]!=0) sign++; if(sign==2&&edge[t][j]==2) {OK=0; Break; } } if(ok==1) {Edge[i][j]=2; DFS (I,j,cou+1); EDGE[I][J]=0; } } }}intMain () {inti,j,q; intx, y; while(SCANF ("%d%d%d", &n,&m,&q)! =EOF) {memset (Edge,0,sizeof(Edge)); while(q--) {scanf ("%d%d",&x,&y); Edge[x][y]=1; } ans=0; for(i=0; i<n; i++) for(j=0; j<m; J + +) if(edge[i][j]==0) {Edge[i][j]=2; DFS (I,J,1); EDGE[I][J]=0; } cout<<ans<<Endl; } return 0;}
View Code
HDU 4499.Cannon Search