題目地址:http://community.topcoder.com/stat?c=problem_statement&pm=1889&rd=4709
題目描述:在整數座標系中,找從(0,0)到(width,height)的不同路徑,每條路徑的長度必須是width+height,這說明點只能向右和向上移動。並且還有一些座標之間的路徑是不能經過的。
思路:grid[i][j]表示從(0,0)到(i,j)不同路徑的數目,則grid[i][j]=gird[i-1][j]+grid[i][j-1]
public class AvoidRoads {
long[][] grid = null;
int[][][][] edges = null;
public long numWays(int width,int height,String[] bad){
grid = new long[width+1][height+1];
edges = new int[width+1][height+1][width+1][height+1];
for(String line: bad){
String[] num = line.split(" ");
int x1 = Integer.parseInt(num[0]);
int y1 = Integer.parseInt(num[1]);
int x2 = Integer.parseInt(num[2]);
int y2 = Integer.parseInt(num[3]);
if(y1==y2 || x1==x2){
edges[x1][y1][x2][y2] = -1;
edges[x2][y2][x1][y1] = -1;
}else{
int max_X = x1>x2 ? x1:x2;
int max_Y = y1>y2 ? y1:y2;
int min_X = x1<x2 ? x1:x2;
int min_Y = y1<y2 ? y1:y2;
if((max_X==x1&&max_Y==y1)||(max_X==x2&&max_Y==y2)){
edges[min_X][min_Y][min_X][max_Y] = -1;
edges[min_X][min_Y][max_X][min_Y] = -1;
edges[min_X][max_Y][max_X][max_Y] = -1;
edges[max_X][min_Y][max_X][max_Y] = -1;
//dual
edges[min_X][max_Y][min_X][min_Y] = -1;
edges[max_X][min_Y][min_X][min_Y] = -1;
edges[max_X][max_Y][min_X][max_Y] = -1;
edges[max_X][max_Y][max_X][min_Y] = -1;
}else{
edges[min_X][max_Y][min_X][min_Y] = -1;
edges[min_X][max_Y][max_X][max_Y] = -1;
edges[max_X][min_Y][min_X][min_Y] = -1;
edges[max_X][min_Y][max_X][max_Y] = -1;
//dual
edges[min_X][min_Y][min_X][max_Y] = -1;
edges[max_X][max_Y][min_X][max_Y] = -1;
edges[min_X][min_Y][max_X][min_Y] = -1;
edges[max_X][max_Y][max_X][min_Y] = -1;
}
}
}
grid[0][0] = 1;
for(int i=0;i<=width;i++)
for(int j=0;j<=height;j++)
{
if(i==0&&j==0) continue;
long temp = 0;
if(i-1>=0&&edges[i-1][j][i][j]!=-1)
temp +=grid[i-1][j];
if(j-1>=0&&edges[i][j-1][i][j]!=-1)
temp +=grid[i][j-1];
grid[i][j] = temp;
}
return grid[width][height];
}
}