[UVA 201 ---二乗シミュレーション]
トピック出典:[ -正方形UVA 201]を入力するためにクリックしてください
説明
子供のボードゲームは、いくつかの接続線が含まれたドットの正方形アレイで構成され
、隣接するドットのペアを。ゲームの一部は、プレイヤーがの正方形の数カウントしている必要が
これらの線によって形成されている特定のサイズを。例えば、以下に示す図において、3つのマスがある
- 2サイズ1とサイズ2の1は、(正方形の「サイズ」は、ラインセグメントの数を形成するために必要である
側。)
あなたの問題は、書き込みであります可能なすべての正方形をカウントする処理を自動化するプログラム。
入力
出力
サンプル入力
4
16
H 1
H 1 3
H 2 1
H 2 2
H 2
H 3 2
H 4 2
H 4 3
V 1
V 2 1
V 2 2
V 2
、V 3 2
V 4 1
V 4 2
V 4 3
2
3
H 1つの
H 2 1
V 2 1
サンプル出力
Problem #1
2 square (s) of size 1
1 square (s) of size 2
**********************************
Problem #2
No completed squares can be found.
問題解決のためのアイデア
シミュレーション。2つの配列が直接水平線と垂直線を記録しました。すべての長さは、再びそれを席巻しています。
ACコード:
#include <stdio.h>
#include <string.h>
const int MAXN = 10;
bool h[MAXN][MAXN],v[MAXN][MAXN];
int main()
{
int n,m,x,y,cas=0;
char ch;
while(~scanf("%d%d",&n,&m))
{
memset(h,false,sizeof(h));
memset(v,false,sizeof(v));
while(m--)
{
scanf(" %c%d%d",&ch,&x,&y);
if(ch=='H') h[x][y]=true;
else v[y][x]=true;
}
if(cas++) printf("\n**********************************\n\n");
printf("Problem #%d\n\n",cas);
bool flag=false;
for(int len=1;len<=n;len++)
{
int num=0,f=0;
for(int i=1;i+len<=n;i++)
{
for(int j=1;j+len<=n;j++)
{
f=1;
for(int k=j;k<j+len;k++)
if(!h[i][k] || !h[i+len][k]) f=0;
for(int k=i;k<i+len;k++)
if(!v[k][j] || !v[k][j+len]) f=0;
num+=f;
}
}
if(num) printf("%d square (s) of size %d\n",num,len),flag=true;
}
if(!flag) printf("No completed squares can be found.\n");
}
return 0;
}