GDUT新生赛—I

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;
}


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值