1 #include<stdio.h>
2 #include<string.h>
3 #define INF 1000000000
4 int hash[45][45][45][45],judge[45][45][45][45],map[45][45],m,n;
5 int dp(int i,int j,int h,int w)
6 {
7 int sum1,sum2,w0,h0;
8 if (hash[i][j][h][w]!=0) return(hash[i][j][h][w]);
9 sum1=sum2=INF;
10 for (w0=1;w0<w;w0++)
11 {
12 if (judge[i][j][h][w0]==1&&judge[i][j+w0][h][w-w0]==1&&(dp(i,j,h,w0)+dp(i,j+w0,h,w-w0)+h)<sum1)
13 sum1=dp(i,j,h,w0)+dp(i,j+w0,h,w-w0)+h;
14 }
15 for (h0=1;h0<h;h0++)
16 {
17 if (judge[i][j][h0][w]==1&&judge[i+h0][j][h-h0][w]==1&&(dp(i,j,h0,w)+dp(i+h0,j,h-h0,w)+w)<sum2)
18 sum2=dp(i,j,h0,w)+dp(i+h0,j,h-h0,w)+w;
19 }
20 if (sum1==sum2&&sum1==INF) hash[i][j][h][w]=0;
21 else if (sum1<sum2) hash[i][j][h][w]=sum1;
22 else hash[i][j][h][w]=sum2;
23 return(hash[i][j][h][w]);
24 }
25 int main()
26 {
27 int k,i,j,h,w,x,y,f=0;
28 while (~scanf("%d%d%d",&n,&m,&k))
29 {
30 memset(map,0,sizeof(map));
31 for (i=1;i<=k;i++)
32 {
33 scanf("%d%d",&x,&y);
34 map[x][y]=1;
35 }
36 memset(hash,0,sizeof(hash));
37 memset(judge,0,sizeof(judge));
38 for (i=1;i<=n;i++)
39 for (j=1;j<=m;j++)
40 for (h=1;h<=n;h++)
41 for (w=1;w<=m;w++)
42 if (map[i+h-1][j+w-1]==1||judge[i][j][h][w-1]==1||judge[i][j][h-1][w]==1) judge[i][j][h][w]=1;
43 f++;
44 printf("Case %d: %d\n",f,dp(1,1,n,m));
45 }
46 return 0;
47 }