Problem I: 只会做水题的jiakin
Description
听说ACM新生杯来了许多大佬,吓得只会做水题的jiakin开始做水题。 题目在一个n行m列二维网格中,位于右下角的格子。现在有若干种水管,类型及状态如下:
在网格中有一些格子布置着水管(只有一种类型一种状态),现在jiakin从最左上的格子开始灌水(即最左上的格子一直有水),且水只能沿水管向右或者向下流,问:jiakin能否成功做好水题。(如图:满足条件)
Input
第一行一个整数T(T < 10),代表T组测试数据。 每组数据第一行有两个整数n和m(n,m<=1000),表示网格的行数和列数。 接下去n行,每行有m个格式为(x,y)的一组数据,代表水管的类型和状态,其中(0,0)表示没水管。
Output
对每组数据第一行“Case x:”,x代表第x组数据。 第二行如果jiakin能成功水题则输出“Well done!”,否则输出“What a pity!”.
Sample Input
3
4 4
(0,0)(4,0)(4,0)(4,0)
(4,0)(4,0)(4,0)(4,0)
(4,0)(4,0)(4,0)(4,0)
(4,0)(4,0)(4,0)(4,0)
3 3
(2,2)(4,0)(4,0)
(3,2)(2,2)(0,0)
(2,1)(2,3)(2,0)
3 3
(2,0)(4,0)(0,0)
(3,0)(3,2)(0,0)
(2,3)(2,0)(2,0)
Sample Output
Case 1:
What a pity!
Case 2:
Well done!
Case 3:
What a pity!
【分析】
大问题没有。。只要知道一点
这道题里的水是可以飘的。。
他没有重力这种说法.....
然后就是这道题需要一张表,当然如果用结构体的方式判断也可以...反正为了减少思考程度我就直接打了张表...
然后水只要能到右下角那一格就可以 也不用流出去..所以很简单的模拟
先将每个状态的水管编号,然后用一个二维数组b[i][j]表示能否相连即可,需要注意的一点是,如果是用表记录能否连通就需要两张表,
因为向下和向右两个方向的连通情况是不一样的。
只是判断两个块之间能否连通麻烦了一点罢了
【代码】
#include <stdio.h>
int ma[5][5]={0};
int b[12][12];
int bb[12][12];
int n,m,t;
int a[1010][1010];
char s[100000];
void judge(int x,int y)
{
if (x==n-1 && y==m-1) {t=0;return;}
if (a[x][y]==-1|| t==0) return;
if (bb[a[x][y]][a[x+1][y]]) judge(x+1,y);
if (b[a[x][y]][a[x][y+1]]) judge(x,y+1);
}
int main()
{
ma[0][0]=-1;
ma[2][0]=1;ma[2][1]=2;ma[2][2]=3;ma[2][3]=4;ma[2][4]=5;ma[2][5]=6;
ma[3][0]=7;ma[3][1]=8;ma[3][2]=9;ma[3][3]=10;ma[4][0]=11;
b[1][1]=1;b[1][3]=1;b[1][7]=1;b[1][8]=1;b[1][9]=1;b[1][11]=1;
b[4][1]=1;b[4][3]=1;b[4][7]=1;b[4][8]=1;b[4][9]=1;b[4][11]=1;
b[7][1]=1;b[7][3]=1;b[7][7]=1;b[7][8]=1;b[7][9]=1;b[7][11]=1;
b[9][1]=1;b[9][3]=1;b[9][7]=1;b[9][8]=1;b[9][9]=1;b[9][11]=1;
b[10][1]=1;b[10][3]=1;b[10][7]=1;b[10][8]=1;b[10][9]=1;b[10][11]=1;
b[11][1]=1;b[11][3]=1;b[11][7]=1;b[11][8]=1;b[11][9]=1;b[11][11]=1;
bb[2][2]=1;bb[2][4]=1;bb[2][8]=1;bb[2][9]=1;bb[2][10]=1;bb[2][11]=1;
bb[3][2]=1;bb[3][4]=1;bb[3][8]=1;bb[3][9]=1;bb[3][10]=1;bb[3][11]=1;
bb[7][2]=1;bb[7][4]=1;bb[7][8]=1;bb[7][9]=1;bb[7][10]=1;bb[7][11]=1;
bb[8][2]=1;bb[8][4]=1;bb[8][8]=1;bb[8][9]=1;bb[8][10]=1;bb[8][11]=1;
bb[10][2]=1;bb[10][4]=1;bb[10][8]=1;bb[10][9]=1;bb[10][10]=1;bb[10][11]=1;
bb[11][2]=1;bb[11][4]=1;bb[11][8]=1;bb[11][9]=1;bb[11][10]=1;bb[11][11]=1;
int pp;scanf("%d",&pp);
for (int p=1;p<=pp;p++)
{
scanf("%d%d",&n,&m);getchar();
for (int i=0;i<n;i++)
{
gets(s);int jj=0;
for (int j=0;s[j]!='\0';j++)
if (s[j]==',')
a[i][jj++]=ma[s[j-1]-48][s[j+1]-48];
}
t=1;
judge(0,0);
printf("Case %d:\n",p);
if (t)
printf("What a pity!\n");
else
printf("Well done!\n");
}
return 0;
}