如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。

URAL/1006

来自"NOCOW"

跳转到: 导航, 搜索

[编辑] C++程序by zhujf553

#include <iostream>
#include <string.h>
#include <stdlib.h>
 
using namespace std;
 
const char LU = 218, RU = 191, LB = 192, RB = 217, V = 179, H = 196;
const int M = 20, N = 50;
 
char smap[M + 1][N + 1];
int sq[15][3];
int ans = -1;
 
void init()
{
	for(int i = 0 ; i < M ; i++)
		cin >> smap[i];
}
 
bool check(int ii, int jj, int k)
{
	if(smap[ii][jj] != ',' && smap[ii][jj] != LU) return false;
	if(smap[ii][jj + k - 1] != ',' && smap[ii][jj + k - 1] != RU) return false;
	if(smap[ii + k - 1][jj] != ',' && smap[ii + k - 1][jj] != LB) return false;
	if(smap[ii + k - 1][jj + k - 1] != ',' && smap[ii + k - 1][jj + k - 1] != RB) return false;
	for(int i = ii + 1 ; i < ii + k - 1 ; i++)
	{
		if(smap[i][jj] != ',' && smap[i][jj] != V) return false;
		if(smap[i][jj + k - 1] != ',' && smap[i][jj + k - 1] != V) return false;
	}
	for(int j = jj + 1 ; j < jj + k - 1 ; j++)
	{
		if(smap[ii][j] != ',' && smap[ii][j] != H) return false;
		if(smap[ii + k - 1][j] != ',' && smap[ii + k - 1][j] != H) return false;
	}
	bool flag = false;
	for(int i = ii ; i <= ii + k - 1 ; i++)
		if(smap[i][jj] != ',' || smap[i][jj + k - 1] != ',') flag = true;
	for(int j = jj ; j <= jj + k - 1 ; j++)
		if(smap[ii][j] != ',' || smap[ii + k - 1][j] != ',') flag = true;
	return flag;
}
 
void clear(int ii, int jj, int k)
{
	for(int i = ii ; i <= ii + k - 1 ; i++)
		smap[i][jj] = smap[i][jj + k - 1] = ',';
	for(int j = jj ; j <= jj + k - 1 ; j++)
		smap[ii][j] = smap[ii + k - 1][j] = ',';
	/*for(int i = 0 ; i < M ; i++)
		cout << smap[i] << endl;
	cout << endl;*/
}
 
void work()
{
	int i, j, k, i1, j1, k1;
	bool flag = true;
	while(flag)
	{
		flag = false;
		for(k = M ; k >= 2 ; k--)
			for(i = 0 ; i < M - k + 1 ; i++)
				for(j = 0 ; j < N - k + 1 ; j++)
				{
					if(i == 6 && j == 11 && k == 7) 
						k = 7;	
					if(check(i, j, k)) 
					{
						ans++;
						flag = true;
						sq[ans][0] = i, sq[ans][1] = j, sq[ans][2] = k;
						clear(i, j, k);
						goto LLL;
					}
				}
		LLL : ;
	}
	cout << ans + 1 << endl;
	for(i = ans ; i >= 0 ; i--)
		cout << sq[i][1] << ' ' << sq[i][0] << ' ' << sq[i][2] << endl;
}
 
int main()
{
	freopen("ural1006.in", "r", stdin);
	freopen("ural1006.out", "w", stdout);
	init();
	work();
	return 0;
}

[编辑] CODE

{受某大牛启发}
program cao;
const
  maxn=20;
  maxm=50;
 
var
  data:array[0..maxn,0..maxm] of longint;
  ans:array[0..20000,1..3] of longint;
  ch:char;
  total,p:longint;
 
procedure init;
var
  i,j:longint;
begin
  total:=1000;
  for i:=1 to maxn do
  begin
    for j:=1 to maxm do
    begin
      read(ch);
      case ch of
        #218:data[i,j]:=1;
        #191:data[i,j]:=2;
        #192:data[i,j]:=3;
        #217:data[i,j]:=4;
        #179:data[i,j]:=5;
        #196:data[i,j]:=6;
        #46:dec(total);
      end;
    end;
    readln;
  end;
end;
 
function can(x,y,a:longint):boolean;
var
  i:longint;
  flag:boolean;
begin
  can:=false;
  flag:=true;
  if data[x,y]<>-1 then
    if data[x,y]<>1 then exit(false);
  if data[x,y]<>-1 then flag:=false;
  if data[x,y+a-1]<>-1 then
    if data[x,y+a-1]<>2 then exit(false);
  if data[x,y+a-1]<>-1 then flag:=false;
  if data[x+a-1,y]<>-1 then
    if data[x+a-1,y]<>3 then exit(false);
  if data[x+a-1,y]<>-1 then flag:=false;
  if data[x+a-1,y+a-1]<>-1 then
    if data[x+a-1,y+a-1]<>4 then exit(false);
  if data[x+a-1,y+a-1]<>-1 then flag:=false;
  for i:=2 to a-1 do
  begin
    if data[x+i-1,y]<>-1 then
      if data[x+i-1,y]<>5 then exit(false);
    if data[x+i-1,y]<>-1 then flag:=false;
    if data[x+i-1,y+a-1]<>-1 then
      if data[x+i-1,y+a-1]<>5 then exit(false);
    if data[x+i-1,y+a-1]<>-1 then flag:=false;
    if data[x,y+i-1]<>-1 then
      if data[x,y+i-1]<>6 then exit(false);
    if data[x,y+i-1]<>-1 then flag:=false;
    if data[x+a-1,y+i-1]<>-1 then
      if data[x+a-1,y+i-1]<>6 then exit(false);
    if data[x+a-1,y+i-1]<>-1 then flag:=false;
  end;
  if flag=false then can:=true;
end;
 
procedure put(x,y,a:longint);
var
  i:longint;
begin
  if data[x,y]<>-1 then dec(total);
  data[x,y]:=-1;
  if data[x,y+a-1]<>-1 then dec(total);
  data[x,y+a-1]:=-1;
  if data[x+a-1,y]<>-1 then dec(total);
  data[x+a-1,y]:=-1;
  if data[x+a-1,y+a-1]<>-1 then dec(total);
  data[x+a-1,y+a-1]:=-1;
  for i:=2 to a-1 do
  begin
    if data[x+i-1,y]<>-1 then dec(total);
    data[x+i-1,y]:=-1;
    if data[x+i-1,y+a-1]<>-1 then dec(total);
    data[x+i-1,y+a-1]:=-1;
    if data[x,y+i-1]<>-1 then dec(total);
    data[x,y+i-1]:=-1;
    if data[x+a-1,y+i-1]<>-1 then dec(total);
    data[x+a-1,y+i-1]:=-1;
  end;
end;
 
procedure find;
var
  i,j,k:longint;
begin
  for i:=1 to maxn do
    for j:=1 to maxm do
      for k:=1 to maxm do
        if can(i,j,k) then
        begin
          put(i,j,k);
          inc(p);
          ans[p,1]:=j-1;
          ans[p,2]:=i-1;
          ans[p,3]:=k;
        end;
end;
 
procedure main;
begin
  p:=0;
  while total>0 do
    find;
end;
 
procedure print;
var
  i:longint;
begin
  writeln(p);
  for i:=p downto 1 do
    writeln(ans[i,1],' ',ans[i,2],' ',ans[i,3]);
end;
 
begin
  init;
  main;
  print;
end.

[编辑] 原始的暴搜程序

program wx;
  var i,j,k,m,n,h:longint;
      s:array[1..20,1..50]of char;
      f:array[1..20,1..50]of boolean;
      l:array[1..2000,1..3]of longint;
  function ff(x,y:longint;c:char):boolean;
    begin
      if (s[x,y]<>c)and(s[x,y]<>'?') then exit(false);
      exit(true);
    end;
  function check(x,y,z:longint):boolean;
    var i:longint;
    begin
      if not(ff(x,y,#218)and ff(x+z-1,y,#192)
             and ff(x,y+z-1,#191)and ff(x+z-1,y+z-1,#217))
        then exit(false);
      for i:=y+1 to y+z-2 do
        if not(ff(x,i,#196)and ff(x+z-1,i,#196)) then exit(false);
      for i:=x+1 to x+z-2 do
        if not(ff(i,y,#179)and ff(i,y+z-1,#179)) then exit(false);
      for i:=x to x+z-1 do
        if (s[i,y]<>'?')or(s[i,y+z-1]<>'?') then exit(true);
      for i:=y+1 to y+z-2 do
        if (s[x,i]<>'?')or(s[x+z-1,i]<>'?') then exit(true);
      exit(false);
    end;
  function min(x,y:longint):longint;
    begin
      if x<y then exit(x);
      exit(y);
    end;
  procedure update(x,y,z:longint);
    var i:longint;
    begin
      for i:=x to x+z-1 do
        begin
          s[i,y]:='?';
          s[i,y+z-1]:='?';
        end;
      for i:=y+1 to y+z-2 do
        begin
          s[x,i]:='?';
          s[x+z-1,i]:='?';
        end;
    end;
  procedure find;
    begin
      for i:=1 to n-1 do
        for j:=1 to m-1 do
          if ff(i,j,#218) then
            for k:=2 to min(n-i,m-j)+1 do
              if check(i,j,k) then
                begin
                  inc(h);
                  l[h,1]:=i;
                  l[h,2]:=j;
                  l[h,3]:=k;
                  update(i,j,k);
                  exit;
                end;
    end;
  function finish:boolean;
    begin
      for i:=1 to n do
        for j:=1 to m do
          if not ff(i,j,'.') then exit(false);
      exit(true);
    end;
  begin
    n:=20;m:=50;
    for i:=1 to n do
      readln(s[i]);
    repeat
      find;
    until finish;
    writeln(h);
    for i:=h downto 1 do
      writeln(l[i,2]-1,' ',l[i,1]-1,' ',l[i,3]);
  end.
个人工具