<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://so.v2.cs.unibo.it/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nat</id>
	<title>Sistemi Operativi - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://so.v2.cs.unibo.it/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nat"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php/Special:Contributions/Nat"/>
	<updated>2026-05-04T13:42:33Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=821</id>
		<title>(Programma C) Un quadrato nella matrice</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=821"/>
		<updated>2014-11-09T17:47:42Z</updated>

		<summary type="html">&lt;p&gt;Nat: /* Soluzione di Nat (corretta) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Soluzione di LorenzoV ==&lt;br /&gt;
&lt;br /&gt;
Questo è un problema uscito per le fasi di qualificazione della Facebook Hacker Cup 2014.&lt;br /&gt;
Il codice sorgente del programma di seguito riportato è in grado di riconoscere se in una matrice quadrata è presente un quadrato &amp;quot;pieno&amp;quot;: il programma accetta in '''input''' un file come da esempio:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
#...&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
####&lt;br /&gt;
#..#&lt;br /&gt;
#..#&lt;br /&gt;
####&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
.....&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dove il primo intero T indica il numero di casi (o test) e gli altri interi n indicano la grandezza di ogni matrice nxn.&amp;lt;br&amp;gt;&lt;br /&gt;
Valgono i seguenti vincoli: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ T ≤ 20&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ N ≤ 20&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Seguendo questo esempio, in '''output''' il programma stamperà le seguenti righe:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Case #1: YES&lt;br /&gt;
Case #2: NO&lt;br /&gt;
Case #3: NO&lt;br /&gt;
Case #4: NO&lt;br /&gt;
Case #5: YES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La matrice n. 2 contiene un # fuori dal quadrato, la matrice n. 3 contiene un quadrato non riempito e la matrice n. 4 contiene un rettangolo.&amp;lt;br&amp;gt;&lt;br /&gt;
Ecco il codice della mia soluzione:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct coordinate{&lt;br /&gt;
    int x;&lt;br /&gt;
    int y;&lt;br /&gt;
}coord;&lt;br /&gt;
&lt;br /&gt;
int max(int x, int y){&lt;br /&gt;
    if (x&amp;gt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int min(int x, int y){&lt;br /&gt;
    if (x&amp;lt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	FILE *fin;&lt;br /&gt;
	const int N=20;&lt;br /&gt;
	int i, j, k, h, n, T, M[N][N];&lt;br /&gt;
	int acase, find;&lt;br /&gt;
	coord asx, adx, bsx, bdx;&lt;br /&gt;
	char str[N];&lt;br /&gt;
	fin = fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
	if (fin == NULL){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Error opening file\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;T);&lt;br /&gt;
	if (T&amp;gt;20 || T&amp;lt;1){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Number of test cases not valid\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	for (k=0; k&amp;lt;T; k++){&lt;br /&gt;
        fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
        if (n&amp;gt;N){&lt;br /&gt;
            fprintf(stderr, &amp;quot;Number of cells too high\n&amp;quot;);&lt;br /&gt;
            exit(1);&lt;br /&gt;
        }&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(fin, &amp;quot;%s&amp;quot;, &amp;amp;str);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++){&lt;br /&gt;
                M[i][j]=str[j];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        asx.x=asx.y=-1;&lt;br /&gt;
        adx.x=adx.y=-1;&lt;br /&gt;
        bsx.x=bsx.y=-1;&lt;br /&gt;
        bdx.x=bdx.y=-1;&lt;br /&gt;
        /*Angolo in alto a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    asx.x=i;&lt;br /&gt;
                    asx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in alto a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    adx.x=i;&lt;br /&gt;
                    adx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bsx.x=i;&lt;br /&gt;
                    bsx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bdx.x=i;&lt;br /&gt;
                    bdx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Verifico che non sia un rettangolo*/&lt;br /&gt;
        acase=1;&lt;br /&gt;
        if (max(bsx.x, bdx.x)-min(asx.x, adx.x)!=max(bsx.y, bdx.y)-min(asx.y, adx.y)){&lt;br /&gt;
            acase=0;&lt;br /&gt;
        } else {&lt;br /&gt;
            /*Verifico se il quadrato è pieno*/&lt;br /&gt;
            for (i=min(asx.x, adx.x); i&amp;lt;=max(bsx.x, bdx.x); i++){&lt;br /&gt;
                for (j=min(asx.y, adx.y); j&amp;lt;=max(bsx.y, bdx.y); j++){&lt;br /&gt;
                    if (M[i][j]!='#'){&lt;br /&gt;
                        acase=0;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (acase) printf(&amp;quot;Case #%i: YES\n&amp;quot;, k+1);&lt;br /&gt;
        else printf(&amp;quot;Case #%i: NO\n&amp;quot;, k+1);&lt;br /&gt;
	}&lt;br /&gt;
	fclose(fin);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:LorenzoV|LorenzoV]] ([[User talk:LorenzoV|talk]]) 17:25, 1 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Nat ==&lt;br /&gt;
&lt;br /&gt;
Il codice che posto qui di seguito verifica che nella matrice presa in input da file ci sia un quadrato pieno, ma attraverso controlli diversi rispetto al codice precedente e con una matrice allocata dinamicamente (si possono passare in input matrici più grandi di 20*20).&lt;br /&gt;
Il programma prende lo stesso input della consegna postata da LorenzoV.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se compilate con gcc va aggiunto  il flag -lm perchè con la libreria math.h (per la radice quadrata) ci sono problemi. &amp;lt;br&amp;gt;&lt;br /&gt;
Es. gcc main.c -o programma -lm&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	FILE *text; &lt;br /&gt;
    	int n,i,j,k,counter,tmp,isx,jsx,boole,cases; int* vect;&lt;br /&gt;
	double squaroot; ;cases=0;&lt;br /&gt;
	text=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
    	if(text==NULL)&lt;br /&gt;
    	{&lt;br /&gt;
        	fprintf(stderr, &amp;quot;Invalid input.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
    	}&lt;br /&gt;
	&lt;br /&gt;
	/*Leggo il numero di casi*/&lt;br /&gt;
    	fscanf(text,&amp;quot;%d&amp;quot;,&amp;amp;cases);&lt;br /&gt;
	if(cases&amp;lt;=0)&lt;br /&gt;
    	{&lt;br /&gt;
        	fprintf(stderr, &amp;quot;Invalid input.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
    	}&lt;br /&gt;
	vect=malloc(cases*sizeof(int));&lt;br /&gt;
	printf(&amp;quot;\nCases =%d\n&amp;quot;,cases);&lt;br /&gt;
&lt;br /&gt;
  for(k=0;k&amp;lt;cases;k++)&lt;br /&gt;
  {     &lt;br /&gt;
	&lt;br /&gt;
	 counter=0;&lt;br /&gt;
&lt;br /&gt;
	/*Leggo la dimensione n della matrice in input*/&lt;br /&gt;
    	fscanf(text,&amp;quot;%d&amp;quot;,&amp;amp;n);&lt;br /&gt;
    	printf(&amp;quot;n=%d \n&amp;quot;,n);&lt;br /&gt;
&lt;br /&gt;
	/*Alloco una matrice M e un vettore r, che mi serve&lt;br /&gt;
	 per copiare l'input su M. &lt;br /&gt;
	In seguito setto tutto con un '.'*/&lt;br /&gt;
    	char **M;&lt;br /&gt;
    	M=(char**)malloc(n * sizeof(char*));&lt;br /&gt;
    	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
    	{M[i]=(char*)malloc(n * sizeof(char));}&lt;br /&gt;
&lt;br /&gt;
    	char *r;&lt;br /&gt;
    	r=(char*)malloc(n*sizeof(char));&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
		r[i]='.';&lt;br /&gt;
		for(j=0;j&amp;lt;n;j++)&lt;br /&gt;
			M[i][j]='.';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(text, &amp;quot;%s&amp;quot;, r);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
	               M[i][j]=r[j];          &lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	/*Stampa matrice*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
			printf(&amp;quot;%c&amp;quot;,M[i][j]);&lt;br /&gt;
&lt;br /&gt;
		printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Conto i cancelletti*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
		{&lt;br /&gt;
			if(M[i][j]=='#')&lt;br /&gt;
			counter++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Logicamente si ha che se il numero &lt;br /&gt;
	di cancelletti non è un numero quadrato&lt;br /&gt;
	allora la matrice non potrà mai contenere un quadrato pieno.*/&lt;br /&gt;
&lt;br /&gt;
			/*Ho risolto il problema del &amp;quot;quadrato di lato 0&amp;quot;&lt;br /&gt;
			con un controllo sul counter dei cancelletti totali*/&lt;br /&gt;
	squaroot=sqrt(counter);&lt;br /&gt;
&lt;br /&gt;
	if(squaroot!=(int)squaroot||counter&amp;lt;1)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;\nThere isn't any square.\n\n&amp;quot;);&lt;br /&gt;
		vect[k]=0;&lt;br /&gt;
		goto final;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Cerco il primo cancelletto,&lt;br /&gt;
	che sarà sicuramente il mio angolo &lt;br /&gt;
	in alto a sinistra del &lt;br /&gt;
	mio potenziale quadrato*/&lt;br /&gt;
	&lt;br /&gt;
			/*Ho risolto il goto con una variabile &lt;br /&gt;
			booleana che cambia valore nel momento&lt;br /&gt;
			in cui trovo il primo cancelletto.&lt;br /&gt;
			Uso il goto però per trattare l'errore  &lt;br /&gt;
			nel caso in cui	la radice del numero di &lt;br /&gt;
			cancelletti non sia intera.*/&lt;br /&gt;
&lt;br /&gt;
	boole=1;&lt;br /&gt;
	for(i=0;i&amp;lt;n&amp;amp;&amp;amp;boole;i++)&lt;br /&gt;
	{&lt;br /&gt;
       		 for(j=0;j&amp;lt;n&amp;amp;&amp;amp;boole;j++)&lt;br /&gt;
        	{&lt;br /&gt;
            		if(M[i][j]=='#')&lt;br /&gt;
            			boole=0;&lt;br /&gt;
        	}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Valuto solo la parte di matrice &lt;br /&gt;
	che inizia con il mio angolo sx&lt;br /&gt;
	e &amp;quot;spazzolo&amp;quot; solo per la lunghezza &lt;br /&gt;
	del mio lato(radice quadrata del numero di cancelletti)&lt;br /&gt;
	e scalo il numero dei cancelletti: se alla fine sono 0 vuol dire&lt;br /&gt;
	che nello spazio k*k (k&amp;lt;=n) ho trovato esattamente k*k cancelletti e non ce ne sono altri.&lt;br /&gt;
	Quindi è un quadrato pieno. */&lt;br /&gt;
	&lt;br /&gt;
			/*Ho risolto il segmentation fault controllando&lt;br /&gt;
			che la mia visita della matrice non esca dal range n &lt;br /&gt;
			oltre che dal range del lato del quadrato. &lt;br /&gt;
			Sottraggo 1 a i e j poichè nel momento in cui &lt;br /&gt;
                        boole cambia valore i cicli incrementano di 1 gli indici.*/&lt;br /&gt;
	isx=i-1; jsx=j-1; tmp=counter;&lt;br /&gt;
&lt;br /&gt;
	for(i=isx;i&amp;lt;(isx+(int)squaroot)&amp;amp;&amp;amp;i&amp;lt;n;i++)&lt;br /&gt;
	{&lt;br /&gt;
	        for(j=jsx;j&amp;lt;(jsx+(int)squaroot)&amp;amp;&amp;amp;j&amp;lt;n;j++)&lt;br /&gt;
	        {&lt;br /&gt;
	            if(M[i][j]=='#')&lt;br /&gt;
	            tmp--;&lt;br /&gt;
	        }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(tmp==0)&lt;br /&gt;
	{printf(&amp;quot;\nThere is a square! :D\n\n&amp;quot;);&lt;br /&gt;
	vect[k]=1;}&lt;br /&gt;
	else&lt;br /&gt;
	{printf(&amp;quot;\nThere isn't any square!\n\n&amp;quot;);&lt;br /&gt;
	vect[k]=0;}&lt;br /&gt;
	&lt;br /&gt;
	final:&lt;br /&gt;
&lt;br /&gt;
	free(M);&lt;br /&gt;
	free(r);&lt;br /&gt;
	&lt;br /&gt;
  }&lt;br /&gt;
	printf(&amp;quot;\nSTOP\n&amp;quot;);&lt;br /&gt;
	for(k=0;k&amp;lt;cases;k++)&lt;br /&gt;
	{&lt;br /&gt;
			&lt;br /&gt;
		printf(&amp;quot;CASE #%d :&amp;quot; ,k+1);		&lt;br /&gt;
		if(vect[k]==1)&lt;br /&gt;
		printf(&amp;quot;YES\n&amp;quot;);&lt;br /&gt;
		else printf(&amp;quot;NO\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	fclose(text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Nat|Nat]] ([[User talk:Nat|talk]]) 18:05, 2 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
== Soluzione di rd ==&lt;br /&gt;
&lt;br /&gt;
Ho provato a risolvere il problema giocando con i bit.&lt;br /&gt;
Il risultato e' riportato qui sotto.&lt;br /&gt;
&lt;br /&gt;
E' compatto ma un po' contorto...&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* count the # of bits set to 1 in an unsigned int */&lt;br /&gt;
int countones(unsigned int x) {&lt;br /&gt;
  int count;&lt;br /&gt;
  for (count=0; x!= 0; x&amp;gt;&amp;gt;=1)&lt;br /&gt;
    count += x &amp;amp; 1;&lt;br /&gt;
  return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* if there is one sequence of 1, return the length of that seq*/&lt;br /&gt;
int seqlen(unsigned int x) {&lt;br /&gt;
  while (x != 0 &amp;amp;&amp;amp; (x &amp;amp; 1)==0)&lt;br /&gt;
    x &amp;gt;&amp;gt;= 1;&lt;br /&gt;
  return countones(x+1)==1?countones(x):0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j;&lt;br /&gt;
  char line[20];&lt;br /&gt;
  unsigned int values,vsum,hsum;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  if (dim&amp;gt;20 || dim&amp;lt;1)&lt;br /&gt;
    error_n_die(&amp;quot;invalid matrix size&amp;quot;);&lt;br /&gt;
  for (i=values=hsum=vsum=0; i&amp;lt;dim; i++) {&lt;br /&gt;
    unsigned int bline;&lt;br /&gt;
    fscanf(fin,&amp;quot;%s&amp;quot;,line);&lt;br /&gt;
    for (j=bline=0; j&amp;lt;dim; j++)&lt;br /&gt;
      bline = (bline &amp;lt;&amp;lt; 1) | (line[j] == '#');&lt;br /&gt;
    values |= 1&amp;lt;&amp;lt;countones(bline);&lt;br /&gt;
    hsum = (hsum &amp;lt;&amp;lt; 1) | (bline != 0);&lt;br /&gt;
    vsum |= bline;&lt;br /&gt;
  }&lt;br /&gt;
  values |= 1&amp;lt;&amp;lt;countones(vsum) | 1&amp;lt;&amp;lt;countones(hsum);&lt;br /&gt;
  values &amp;amp;= ~1;&lt;br /&gt;
  values |= 1&amp;lt;&amp;lt;seqlen(vsum) | 1&amp;lt;&amp;lt;seqlen(hsum);&lt;br /&gt;
  return countones(values) == 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
  &lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 07:54, 4 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Altre considerazioni e un'altra soluzione (rd) ==&lt;br /&gt;
&lt;br /&gt;
(NB: le indicazioni in '''Bold text''' sono esercizi da svolgere qui sul blog.)&lt;br /&gt;
&lt;br /&gt;
Ho riguardato i programmi proposti.&lt;br /&gt;
&lt;br /&gt;
La soluzione di LorenzoV ha un problema. Lui cerca i quattro vertici e poi controlla che tutti gli elementi all'interno siano '#'.&lt;br /&gt;
Se provate con questa configurazione:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
.....&lt;br /&gt;
.###.&lt;br /&gt;
####.&lt;br /&gt;
.###.&lt;br /&gt;
.....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
vi dice che e' un quadrato. Si potrebbe correggere il programma cambiando il modo per cercare i vertici... '''come'''?&lt;br /&gt;
&lt;br /&gt;
La soluzione di Nat invece funziona dal punto di vista algoritmico. Lui controlla che il numero di # sia un quadrato perfetto N^2 e quindi controlla che a partire dal primo # che si incontra scandendo la matrice in senso lessicografico tutti gli elementi nel quadrato a destra e in basso di lato N siano '#'.&lt;br /&gt;
&lt;br /&gt;
Pero'...&lt;br /&gt;
con questa configurazione:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
.....#####&lt;br /&gt;
##########&lt;br /&gt;
##########&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
il risultato e': Segmentation fault. '''Perch&amp;amp;eacute;?'''&lt;br /&gt;
&lt;br /&gt;
Inoltre se si fornisce una matrice vuota come:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
4&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dice che c'e' un quadrato (che sarebbe coerente, e' un quadrato di dimensione 0, ma secondo me le specifiche indicando &amp;quot;pieno&amp;quot; vogliono escludere questo caso).&lt;br /&gt;
&lt;br /&gt;
Ho poi un paio di commenti stilistici per Nat: la soluzione non rispetta le specifiche per il formato del file in input e usa un 'goto' non per casi di errore.&lt;br /&gt;
Il suo problema era &amp;quot;rompere&amp;quot; il doppio ciclo: '''come si puo' fare'''?&lt;br /&gt;
&lt;br /&gt;
Infine vi lascio questa altra soluzione.&lt;br /&gt;
Non usa alcuna memorizzazione per la matrice, neanche per una singola riga. Calcola se ci sia o meno un quadrato durante la lettura carattere per carattere.&lt;br /&gt;
Quindi anche se fosse data in input una matrice di un milione per un milione di elementi il programma userebbe sempre solo 8 interi.&lt;br /&gt;
&lt;br /&gt;
'''Chi ne descrive il funzionamento'''?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void flushtonl(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int c;&lt;br /&gt;
  while ((c=fgetc(fin)) != '\n' &amp;amp;&amp;amp; c!=EOF)&lt;br /&gt;
    ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j,c;&lt;br /&gt;
  int mini,maxi,minj,maxj;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  flushtonl(fin);&lt;br /&gt;
  mini=maxi=minj=maxj=-1;&lt;br /&gt;
  for (i=0; i&amp;lt;dim+1; i++) {&lt;br /&gt;
    int n=0;&lt;br /&gt;
    for (j=0; j&amp;lt;dim+1; j++) {&lt;br /&gt;
      c=(i&amp;lt;dim &amp;amp;&amp;amp; j&amp;lt;dim)?fgetc(fin):'.';&lt;br /&gt;
      if (mini&amp;lt;0) {&lt;br /&gt;
        if (c=='#') {&lt;br /&gt;
          if (minj&amp;lt;0) minj=j;&lt;br /&gt;
        } else {&lt;br /&gt;
          if (minj&amp;gt;=0) maxj=j-1,mini=i;&lt;br /&gt;
        }&lt;br /&gt;
      } else if (maxi&amp;lt;0) {&lt;br /&gt;
        if (c!='#' ^ (j &amp;lt; minj || j &amp;gt; maxj))&lt;br /&gt;
          if (c == '#' || j != minj)&lt;br /&gt;
            mini=maxi=minj=maxj=dim;&lt;br /&gt;
          else&lt;br /&gt;
            maxi=i-1;&lt;br /&gt;
      } else {&lt;br /&gt;
        if (c=='#')&lt;br /&gt;
          mini=maxi=minj=maxj=dim;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (i&amp;lt;dim) flushtonl(fin);&lt;br /&gt;
  }&lt;br /&gt;
  return maxj-minj == maxi-mini &amp;amp;&amp;amp; mini&amp;gt;=0 &amp;amp;&amp;amp; maxi&amp;lt;dim;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 12:45, 6 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
''c'era un bug. Ho corretto il confronto di riga 36 da &amp;quot;if (c == '#')&amp;quot; a &amp;quot;if (c == '#' || j != minj)&amp;quot;''.&lt;br /&gt;
'''Chi riesce a trovare il caso che non veniva correttamente riconosciuto? (spiegando il perch&amp;amp;eacute;!)'''&lt;br /&gt;
&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 20:30, 6 November 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Nat</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=820</id>
		<title>(Programma C) Un quadrato nella matrice</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=820"/>
		<updated>2014-11-09T17:05:49Z</updated>

		<summary type="html">&lt;p&gt;Nat: /* Soluzione di Nat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Soluzione di LorenzoV ==&lt;br /&gt;
&lt;br /&gt;
Questo è un problema uscito per le fasi di qualificazione della Facebook Hacker Cup 2014.&lt;br /&gt;
Il codice sorgente del programma di seguito riportato è in grado di riconoscere se in una matrice quadrata è presente un quadrato &amp;quot;pieno&amp;quot;: il programma accetta in '''input''' un file come da esempio:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
#...&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
####&lt;br /&gt;
#..#&lt;br /&gt;
#..#&lt;br /&gt;
####&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
.....&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dove il primo intero T indica il numero di casi (o test) e gli altri interi n indicano la grandezza di ogni matrice nxn.&amp;lt;br&amp;gt;&lt;br /&gt;
Valgono i seguenti vincoli: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ T ≤ 20&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ N ≤ 20&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Seguendo questo esempio, in '''output''' il programma stamperà le seguenti righe:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Case #1: YES&lt;br /&gt;
Case #2: NO&lt;br /&gt;
Case #3: NO&lt;br /&gt;
Case #4: NO&lt;br /&gt;
Case #5: YES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La matrice n. 2 contiene un # fuori dal quadrato, la matrice n. 3 contiene un quadrato non riempito e la matrice n. 4 contiene un rettangolo.&amp;lt;br&amp;gt;&lt;br /&gt;
Ecco il codice della mia soluzione:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct coordinate{&lt;br /&gt;
    int x;&lt;br /&gt;
    int y;&lt;br /&gt;
}coord;&lt;br /&gt;
&lt;br /&gt;
int max(int x, int y){&lt;br /&gt;
    if (x&amp;gt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int min(int x, int y){&lt;br /&gt;
    if (x&amp;lt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	FILE *fin;&lt;br /&gt;
	const int N=20;&lt;br /&gt;
	int i, j, k, h, n, T, M[N][N];&lt;br /&gt;
	int acase, find;&lt;br /&gt;
	coord asx, adx, bsx, bdx;&lt;br /&gt;
	char str[N];&lt;br /&gt;
	fin = fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
	if (fin == NULL){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Error opening file\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;T);&lt;br /&gt;
	if (T&amp;gt;20 || T&amp;lt;1){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Number of test cases not valid\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	for (k=0; k&amp;lt;T; k++){&lt;br /&gt;
        fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
        if (n&amp;gt;N){&lt;br /&gt;
            fprintf(stderr, &amp;quot;Number of cells too high\n&amp;quot;);&lt;br /&gt;
            exit(1);&lt;br /&gt;
        }&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(fin, &amp;quot;%s&amp;quot;, &amp;amp;str);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++){&lt;br /&gt;
                M[i][j]=str[j];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        asx.x=asx.y=-1;&lt;br /&gt;
        adx.x=adx.y=-1;&lt;br /&gt;
        bsx.x=bsx.y=-1;&lt;br /&gt;
        bdx.x=bdx.y=-1;&lt;br /&gt;
        /*Angolo in alto a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    asx.x=i;&lt;br /&gt;
                    asx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in alto a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    adx.x=i;&lt;br /&gt;
                    adx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bsx.x=i;&lt;br /&gt;
                    bsx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bdx.x=i;&lt;br /&gt;
                    bdx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Verifico che non sia un rettangolo*/&lt;br /&gt;
        acase=1;&lt;br /&gt;
        if (max(bsx.x, bdx.x)-min(asx.x, adx.x)!=max(bsx.y, bdx.y)-min(asx.y, adx.y)){&lt;br /&gt;
            acase=0;&lt;br /&gt;
        } else {&lt;br /&gt;
            /*Verifico se il quadrato è pieno*/&lt;br /&gt;
            for (i=min(asx.x, adx.x); i&amp;lt;=max(bsx.x, bdx.x); i++){&lt;br /&gt;
                for (j=min(asx.y, adx.y); j&amp;lt;=max(bsx.y, bdx.y); j++){&lt;br /&gt;
                    if (M[i][j]!='#'){&lt;br /&gt;
                        acase=0;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (acase) printf(&amp;quot;Case #%i: YES\n&amp;quot;, k+1);&lt;br /&gt;
        else printf(&amp;quot;Case #%i: NO\n&amp;quot;, k+1);&lt;br /&gt;
	}&lt;br /&gt;
	fclose(fin);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:LorenzoV|LorenzoV]] ([[User talk:LorenzoV|talk]]) 17:25, 1 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Nat ==&lt;br /&gt;
&lt;br /&gt;
Il codice che posto qui di seguito verifica che nella matrice presa in input da file ci sia un quadrato pieno, ma attraverso controlli diversi rispetto al codice precedente e con una matrice allocata dinamicamente (si possono passare in input matrici più grandi di 20*20).&lt;br /&gt;
Il programma prende in input un file in questa forma&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
###..&lt;br /&gt;
###..&lt;br /&gt;
###..&lt;br /&gt;
.....&lt;br /&gt;
.....&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dove 5 è il numero di colonne(righe) della matrice n*n. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se compilate con gcc va aggiunto  il flag -lm perchè con la libreria math.h (per la radice quadrata) ci sono problemi. &amp;lt;br&amp;gt;&lt;br /&gt;
Es. gcc main.c -o programma -lm&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	FILE *text; &lt;br /&gt;
    	int n,i,j,counter,tmp,isx,jsx,boole;&lt;br /&gt;
	double squaroot; counter=0;&lt;br /&gt;
	text=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
    	if(text==NULL)&lt;br /&gt;
    	{&lt;br /&gt;
        	fprintf(stderr, &amp;quot;Invalid input.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
    	}&lt;br /&gt;
	&lt;br /&gt;
	/*Leggo la dimensione n della matrice in input*/&lt;br /&gt;
    	fscanf(text,&amp;quot;%d&amp;quot;,&amp;amp;n);&lt;br /&gt;
    	printf(&amp;quot;%d \n&amp;quot;,n);&lt;br /&gt;
	/*Alloco una matrice M e un vettore r, che mi serve&lt;br /&gt;
	 per copiare l'input su M. &lt;br /&gt;
	In seguito setto tutto con un '.'*/&lt;br /&gt;
    	char **M;&lt;br /&gt;
    	M=(char**)malloc(n * sizeof(char*));&lt;br /&gt;
    	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
    	{M[i]=(char*)malloc(n * sizeof(char));}&lt;br /&gt;
&lt;br /&gt;
    	char *r;&lt;br /&gt;
    	r=(char*)malloc(n*sizeof(char));&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
		r[i]='.';&lt;br /&gt;
		for(j=0;j&amp;lt;n;j++)&lt;br /&gt;
			M[i][j]='.';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(text, &amp;quot;%s&amp;quot;, r);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
	               M[i][j]=r[j];          &lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	/*Stampa matrice*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
			printf(&amp;quot;%c&amp;quot;,M[i][j]);&lt;br /&gt;
&lt;br /&gt;
		printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Conto i cancelletti*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
		{&lt;br /&gt;
			if(M[i][j]=='#')&lt;br /&gt;
			counter++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Logicamente si ha che se il numero &lt;br /&gt;
	di cancelletti non è un numero quadrato&lt;br /&gt;
	allora la matrice non potrà mai contenere un quadrato pieno.*/&lt;br /&gt;
&lt;br /&gt;
			/*Ho risolto il problema del &amp;quot;quadrato di lato 0&amp;quot;&lt;br /&gt;
			con un controllo sul counter dei cancelletti totali*/&lt;br /&gt;
			squaroot=sqrt(counter);&lt;br /&gt;
	if(squaroot!=(int)squaroot||counter==0)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;\nThere isn't any square.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Cerco il primo cancelletto,&lt;br /&gt;
	che sarà sicuramente il mio angolo &lt;br /&gt;
	in alto a sinistra del &lt;br /&gt;
	mio potenziale quadrato*/&lt;br /&gt;
	&lt;br /&gt;
			/*Ho risolto il goto con una variabile &lt;br /&gt;
			booleana che cambia di valore nel momento&lt;br /&gt;
			in cui trovo il primo cancelletto */&lt;br /&gt;
&lt;br /&gt;
	boole=1;&lt;br /&gt;
	for(i=0;i&amp;lt;n&amp;amp;&amp;amp;boole;i++)&lt;br /&gt;
	{&lt;br /&gt;
       		 for(j=0;j&amp;lt;n&amp;amp;&amp;amp;boole;j++)&lt;br /&gt;
        	{&lt;br /&gt;
            		if(M[i][j]=='#')&lt;br /&gt;
            			boole=0;&lt;br /&gt;
        	}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Valuto solo la parte di matrice &lt;br /&gt;
	che inizia con il mio angolo sx&lt;br /&gt;
	e &amp;quot;spazzolo&amp;quot; solo per la lunghezza &lt;br /&gt;
	del mio lato(radice quadrata del numero di cancelletti)&lt;br /&gt;
	e scalo il numero dei cancelletti: se alla fine sono 0 vuol dire&lt;br /&gt;
	che nello spazio k*k (k&amp;lt;=n) ho trovato esattamente k*k cancelletti e non ce ne sono altri.&lt;br /&gt;
	Quindi è un quadrato pieno. */&lt;br /&gt;
	&lt;br /&gt;
			/*Ho risolto il segmentation fault controllando&lt;br /&gt;
			che la mia visita della matrice non esca dal range n &lt;br /&gt;
			oltre che dal range del lato del quadrato.&lt;br /&gt;
                         Sottraggo 1 a i e j poichè nel momento in cui &lt;br /&gt;
                         boole cambia valore i cicli incrementano di 1 gli indici.*/&lt;br /&gt;
	isx=i-1; jsx=j-1; tmp=counter;&lt;br /&gt;
	for(i=isx;i&amp;lt;(isx+(int)squaroot)&amp;amp;&amp;amp;i&amp;lt;n;i++)&lt;br /&gt;
	{&lt;br /&gt;
	        for(j=jsx;j&amp;lt;(jsx+(int)squaroot)&amp;amp;&amp;amp;j&amp;lt;n;j++)&lt;br /&gt;
	        {&lt;br /&gt;
	            if(M[i][j]=='#')&lt;br /&gt;
	            tmp--;&lt;br /&gt;
	        }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(tmp==0)&lt;br /&gt;
	printf(&amp;quot;\n\nThere is a square! :D\n\n&amp;quot;);&lt;br /&gt;
	else&lt;br /&gt;
	printf(&amp;quot;\n\nThere isn't any square!\n\n&amp;quot;);&lt;br /&gt;
	fclose(text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Nat|Nat]] ([[User talk:Nat|talk]]) 18:05, 2 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
== Soluzione di rd ==&lt;br /&gt;
&lt;br /&gt;
Ho provato a risolvere il problema giocando con i bit.&lt;br /&gt;
Il risultato e' riportato qui sotto.&lt;br /&gt;
&lt;br /&gt;
E' compatto ma un po' contorto...&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* count the # of bits set to 1 in an unsigned int */&lt;br /&gt;
int countones(unsigned int x) {&lt;br /&gt;
  int count;&lt;br /&gt;
  for (count=0; x!= 0; x&amp;gt;&amp;gt;=1)&lt;br /&gt;
    count += x &amp;amp; 1;&lt;br /&gt;
  return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* if there is one sequence of 1, return the length of that seq*/&lt;br /&gt;
int seqlen(unsigned int x) {&lt;br /&gt;
  while (x != 0 &amp;amp;&amp;amp; (x &amp;amp; 1)==0)&lt;br /&gt;
    x &amp;gt;&amp;gt;= 1;&lt;br /&gt;
  return countones(x+1)==1?countones(x):0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j;&lt;br /&gt;
  char line[20];&lt;br /&gt;
  unsigned int values,vsum,hsum;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  if (dim&amp;gt;20 || dim&amp;lt;1)&lt;br /&gt;
    error_n_die(&amp;quot;invalid matrix size&amp;quot;);&lt;br /&gt;
  for (i=values=hsum=vsum=0; i&amp;lt;dim; i++) {&lt;br /&gt;
    unsigned int bline;&lt;br /&gt;
    fscanf(fin,&amp;quot;%s&amp;quot;,line);&lt;br /&gt;
    for (j=bline=0; j&amp;lt;dim; j++)&lt;br /&gt;
      bline = (bline &amp;lt;&amp;lt; 1) | (line[j] == '#');&lt;br /&gt;
    values |= 1&amp;lt;&amp;lt;countones(bline);&lt;br /&gt;
    hsum = (hsum &amp;lt;&amp;lt; 1) | (bline != 0);&lt;br /&gt;
    vsum |= bline;&lt;br /&gt;
  }&lt;br /&gt;
  values |= 1&amp;lt;&amp;lt;countones(vsum) | 1&amp;lt;&amp;lt;countones(hsum);&lt;br /&gt;
  values &amp;amp;= ~1;&lt;br /&gt;
  values |= 1&amp;lt;&amp;lt;seqlen(vsum) | 1&amp;lt;&amp;lt;seqlen(hsum);&lt;br /&gt;
  return countones(values) == 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
  &lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 07:54, 4 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Altre considerazioni e un'altra soluzione (rd) ==&lt;br /&gt;
&lt;br /&gt;
(NB: le indicazioni in '''Bold text''' sono esercizi da svolgere qui sul blog.)&lt;br /&gt;
&lt;br /&gt;
Ho riguardato i programmi proposti.&lt;br /&gt;
&lt;br /&gt;
La soluzione di LorenzoV ha un problema. Lui cerca i quattro vertici e poi controlla che tutti gli elementi all'interno siano '#'.&lt;br /&gt;
Se provate con questa configurazione:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
.....&lt;br /&gt;
.###.&lt;br /&gt;
####.&lt;br /&gt;
.###.&lt;br /&gt;
.....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
vi dice che e' un quadrato. Si potrebbe correggere il programma cambiando il modo per cercare i vertici... '''come'''?&lt;br /&gt;
&lt;br /&gt;
La soluzione di Nat invece funziona dal punto di vista algoritmico. Lui controlla che il numero di # sia un quadrato perfetto N^2 e quindi controlla che a partire dal primo # che si incontra scandendo la matrice in senso lessicografico tutti gli elementi nel quadrato a destra e in basso di lato N siano '#'.&lt;br /&gt;
&lt;br /&gt;
Pero'...&lt;br /&gt;
con questa configurazione:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
.....#####&lt;br /&gt;
##########&lt;br /&gt;
##########&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
il risultato e': Segmentation fault. '''Perch&amp;amp;eacute;?'''&lt;br /&gt;
&lt;br /&gt;
Inoltre se si fornisce una matrice vuota come:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
4&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dice che c'e' un quadrato (che sarebbe coerente, e' un quadrato di dimensione 0, ma secondo me le specifiche indicando &amp;quot;pieno&amp;quot; vogliono escludere questo caso).&lt;br /&gt;
&lt;br /&gt;
Ho poi un paio di commenti stilistici per Nat: la soluzione non rispetta le specifiche per il formato del file in input e usa un 'goto' non per casi di errore.&lt;br /&gt;
Il suo problema era &amp;quot;rompere&amp;quot; il doppio ciclo: '''come si puo' fare'''?&lt;br /&gt;
&lt;br /&gt;
Infine vi lascio questa altra soluzione.&lt;br /&gt;
Non usa alcuna memorizzazione per la matrice, neanche per una singola riga. Calcola se ci sia o meno un quadrato durante la lettura carattere per carattere.&lt;br /&gt;
Quindi anche se fosse data in input una matrice di un milione per un milione di elementi il programma userebbe sempre solo 8 interi.&lt;br /&gt;
&lt;br /&gt;
'''Chi ne descrive il funzionamento'''?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void flushtonl(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int c;&lt;br /&gt;
  while ((c=fgetc(fin)) != '\n' &amp;amp;&amp;amp; c!=EOF)&lt;br /&gt;
    ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j,c;&lt;br /&gt;
  int mini,maxi,minj,maxj;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  flushtonl(fin);&lt;br /&gt;
  mini=maxi=minj=maxj=-1;&lt;br /&gt;
  for (i=0; i&amp;lt;dim+1; i++) {&lt;br /&gt;
    int n=0;&lt;br /&gt;
    for (j=0; j&amp;lt;dim+1; j++) {&lt;br /&gt;
      c=(i&amp;lt;dim &amp;amp;&amp;amp; j&amp;lt;dim)?fgetc(fin):'.';&lt;br /&gt;
      if (mini&amp;lt;0) {&lt;br /&gt;
        if (c=='#') {&lt;br /&gt;
          if (minj&amp;lt;0) minj=j;&lt;br /&gt;
        } else {&lt;br /&gt;
          if (minj&amp;gt;=0) maxj=j-1,mini=i;&lt;br /&gt;
        }&lt;br /&gt;
      } else if (maxi&amp;lt;0) {&lt;br /&gt;
        if (c!='#' ^ (j &amp;lt; minj || j &amp;gt; maxj))&lt;br /&gt;
          if (c == '#' || j != minj)&lt;br /&gt;
            mini=maxi=minj=maxj=dim;&lt;br /&gt;
          else&lt;br /&gt;
            maxi=i-1;&lt;br /&gt;
      } else {&lt;br /&gt;
        if (c=='#')&lt;br /&gt;
          mini=maxi=minj=maxj=dim;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (i&amp;lt;dim) flushtonl(fin);&lt;br /&gt;
  }&lt;br /&gt;
  return maxj-minj == maxi-mini &amp;amp;&amp;amp; mini&amp;gt;=0 &amp;amp;&amp;amp; maxi&amp;lt;dim;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 12:45, 6 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
''c'era un bug. Ho corretto il confronto di riga 36 da &amp;quot;if (c == '#')&amp;quot; a &amp;quot;if (c == '#' || j != minj)&amp;quot;''.&lt;br /&gt;
'''Chi riesce a trovare il caso che non veniva correttamente riconosciuto? (spiegando il perch&amp;amp;eacute;!)'''&lt;br /&gt;
&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 20:30, 6 November 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Nat</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=819</id>
		<title>(Programma C) Un quadrato nella matrice</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=819"/>
		<updated>2014-11-09T15:17:39Z</updated>

		<summary type="html">&lt;p&gt;Nat: /* Soluzione di Nat (corretta)*/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Soluzione di LorenzoV ==&lt;br /&gt;
&lt;br /&gt;
Questo è un problema uscito per le fasi di qualificazione della Facebook Hacker Cup 2014.&lt;br /&gt;
Il codice sorgente del programma di seguito riportato è in grado di riconoscere se in una matrice quadrata è presente un quadrato &amp;quot;pieno&amp;quot;: il programma accetta in '''input''' un file come da esempio:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
#...&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
####&lt;br /&gt;
#..#&lt;br /&gt;
#..#&lt;br /&gt;
####&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
.....&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dove il primo intero T indica il numero di casi (o test) e gli altri interi n indicano la grandezza di ogni matrice nxn.&amp;lt;br&amp;gt;&lt;br /&gt;
Valgono i seguenti vincoli: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ T ≤ 20&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ N ≤ 20&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Seguendo questo esempio, in '''output''' il programma stamperà le seguenti righe:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Case #1: YES&lt;br /&gt;
Case #2: NO&lt;br /&gt;
Case #3: NO&lt;br /&gt;
Case #4: NO&lt;br /&gt;
Case #5: YES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La matrice n. 2 contiene un # fuori dal quadrato, la matrice n. 3 contiene un quadrato non riempito e la matrice n. 4 contiene un rettangolo.&amp;lt;br&amp;gt;&lt;br /&gt;
Ecco il codice della mia soluzione:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct coordinate{&lt;br /&gt;
    int x;&lt;br /&gt;
    int y;&lt;br /&gt;
}coord;&lt;br /&gt;
&lt;br /&gt;
int max(int x, int y){&lt;br /&gt;
    if (x&amp;gt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int min(int x, int y){&lt;br /&gt;
    if (x&amp;lt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	FILE *fin;&lt;br /&gt;
	const int N=20;&lt;br /&gt;
	int i, j, k, h, n, T, M[N][N];&lt;br /&gt;
	int acase, find;&lt;br /&gt;
	coord asx, adx, bsx, bdx;&lt;br /&gt;
	char str[N];&lt;br /&gt;
	fin = fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
	if (fin == NULL){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Error opening file\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;T);&lt;br /&gt;
	if (T&amp;gt;20 || T&amp;lt;1){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Number of test cases not valid\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	for (k=0; k&amp;lt;T; k++){&lt;br /&gt;
        fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
        if (n&amp;gt;N){&lt;br /&gt;
            fprintf(stderr, &amp;quot;Number of cells too high\n&amp;quot;);&lt;br /&gt;
            exit(1);&lt;br /&gt;
        }&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(fin, &amp;quot;%s&amp;quot;, &amp;amp;str);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++){&lt;br /&gt;
                M[i][j]=str[j];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        asx.x=asx.y=-1;&lt;br /&gt;
        adx.x=adx.y=-1;&lt;br /&gt;
        bsx.x=bsx.y=-1;&lt;br /&gt;
        bdx.x=bdx.y=-1;&lt;br /&gt;
        /*Angolo in alto a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    asx.x=i;&lt;br /&gt;
                    asx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in alto a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    adx.x=i;&lt;br /&gt;
                    adx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bsx.x=i;&lt;br /&gt;
                    bsx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bdx.x=i;&lt;br /&gt;
                    bdx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Verifico che non sia un rettangolo*/&lt;br /&gt;
        acase=1;&lt;br /&gt;
        if (max(bsx.x, bdx.x)-min(asx.x, adx.x)!=max(bsx.y, bdx.y)-min(asx.y, adx.y)){&lt;br /&gt;
            acase=0;&lt;br /&gt;
        } else {&lt;br /&gt;
            /*Verifico se il quadrato è pieno*/&lt;br /&gt;
            for (i=min(asx.x, adx.x); i&amp;lt;=max(bsx.x, bdx.x); i++){&lt;br /&gt;
                for (j=min(asx.y, adx.y); j&amp;lt;=max(bsx.y, bdx.y); j++){&lt;br /&gt;
                    if (M[i][j]!='#'){&lt;br /&gt;
                        acase=0;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (acase) printf(&amp;quot;Case #%i: YES\n&amp;quot;, k+1);&lt;br /&gt;
        else printf(&amp;quot;Case #%i: NO\n&amp;quot;, k+1);&lt;br /&gt;
	}&lt;br /&gt;
	fclose(fin);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:LorenzoV|LorenzoV]] ([[User talk:LorenzoV|talk]]) 17:25, 1 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Nat ==&lt;br /&gt;
&lt;br /&gt;
Il codice che posto qui di seguito verifica che nella matrice presa in input da file ci sia un quadrato pieno, ma attraverso controlli diversi rispetto al codice precedente e con una matrice allocata dinamicamente (si possono passare in input matrici più grandi di 20*20).&lt;br /&gt;
Il programma prende in input un file in questa forma&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
###..&lt;br /&gt;
###..&lt;br /&gt;
###..&lt;br /&gt;
.....&lt;br /&gt;
.....&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dove 5 è il numero di colonne(righe) della matrice n*n. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se compilate con gcc va aggiunto  il flag -lm perchè con la libreria math.h (per la radice quadrata) ci sono problemi. &amp;lt;br&amp;gt;&lt;br /&gt;
Es. gcc main.c -o programma -lm&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	FILE *text; &lt;br /&gt;
    	int n,i,j,counter,tmp,isx,jsx,bool;&lt;br /&gt;
	double squaroot; counter=0;&lt;br /&gt;
	text=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
    	if(text==NULL)&lt;br /&gt;
    	{&lt;br /&gt;
        	fprintf(stderr, &amp;quot;Invalid input.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
    	}&lt;br /&gt;
	&lt;br /&gt;
	/*Leggo la dimensione n della matrice in input*/&lt;br /&gt;
    	fscanf(text,&amp;quot;%d&amp;quot;,&amp;amp;n);&lt;br /&gt;
    	printf(&amp;quot;%d \n&amp;quot;,n);&lt;br /&gt;
	/*Alloco una matrice M e un vettore r, che mi serve&lt;br /&gt;
	 per copiare l'input su M. &lt;br /&gt;
	In seguito setto tutto con un '.'*/&lt;br /&gt;
    	char **M;&lt;br /&gt;
    	M=(char**)malloc(n * sizeof(char*));&lt;br /&gt;
    	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
    	{M[i]=(char*)malloc(n * sizeof(char));}&lt;br /&gt;
&lt;br /&gt;
    	char *r;&lt;br /&gt;
    	r=(char*)malloc(n*sizeof(char));&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
		r[i]='.';&lt;br /&gt;
		for(j=0;j&amp;lt;n;j++)&lt;br /&gt;
			M[i][j]='.';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(text, &amp;quot;%s&amp;quot;, r);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
	               M[i][j]=r[j];          &lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	/*Stampa matrice*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
			printf(&amp;quot;%c&amp;quot;,M[i][j]);&lt;br /&gt;
&lt;br /&gt;
		printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Conto i cancelletti*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
		{&lt;br /&gt;
			if(M[i][j]=='#')&lt;br /&gt;
			counter++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Logicamente si ha che se il numero &lt;br /&gt;
	di cancelletti non è un numero quadrato&lt;br /&gt;
	allora la matrice non potrà mai contenere un quadrato pieno.*/&lt;br /&gt;
&lt;br /&gt;
			/*Ho risolto il problema del &amp;quot;quadrato di lato 0&amp;quot;&lt;br /&gt;
			con un controllo sul counter dei cancelletti totali*/&lt;br /&gt;
			squaroot=sqrt(counter);&lt;br /&gt;
	if(squaroot!=(int)squaroot||counter==0)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;\nThere isn't any square.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Cerco il primo cancelletto,&lt;br /&gt;
	che sarà sicuramente il mio angolo &lt;br /&gt;
	in alto a sinistra del &lt;br /&gt;
	mio potenziale quadrato*/&lt;br /&gt;
	&lt;br /&gt;
			/*Ho risolto il goto con una variabile &lt;br /&gt;
			booleana che cambia di valore nel momento&lt;br /&gt;
			in cui trovo il primo cancelletto */&lt;br /&gt;
&lt;br /&gt;
	bool=1;&lt;br /&gt;
	for(i=0;i&amp;lt;n&amp;amp;&amp;amp;bool;i++)&lt;br /&gt;
	{&lt;br /&gt;
       		 for(j=0;j&amp;lt;n&amp;amp;&amp;amp;bool;j++)&lt;br /&gt;
        	{&lt;br /&gt;
            		if(M[i][j]=='#')&lt;br /&gt;
            			bool=0;&lt;br /&gt;
        	}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Valuto solo la parte di matrice &lt;br /&gt;
	che inizia con il mio angolo sx&lt;br /&gt;
	e &amp;quot;spazzolo&amp;quot; solo per la lunghezza &lt;br /&gt;
	del mio lato(radice quadrata del numero di cancelletti)&lt;br /&gt;
	e scalo il numero dei cancelletti: se alla fine sono 0 vuol dire&lt;br /&gt;
	che nello spazio k*k (k&amp;lt;=n) ho trovato esattamente k*k cancelletti e non ce ne sono altri.&lt;br /&gt;
	Quindi è un quadrato pieno. */&lt;br /&gt;
	&lt;br /&gt;
			/*Ho risolto il segmentation fault controllando&lt;br /&gt;
			che la mia visita della matrice non esca dal range n &lt;br /&gt;
			oltre che dal range del lato del quadrato.*/&lt;br /&gt;
	isx=i; jsx=j; tmp=counter;&lt;br /&gt;
	for(i=isx;i&amp;lt;(isx+(int)squaroot)&amp;amp;&amp;amp;i&amp;lt;n;i++)&lt;br /&gt;
	{&lt;br /&gt;
	        for(j=jsx;j&amp;lt;(jsx+(int)squaroot)&amp;amp;&amp;amp;j&amp;lt;n;j++)&lt;br /&gt;
	        {&lt;br /&gt;
	            if(M[i][j]=='#')&lt;br /&gt;
	            tmp--;&lt;br /&gt;
	        }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(tmp==0)&lt;br /&gt;
	printf(&amp;quot;\n\nThere is a square! :D\n\n&amp;quot;);&lt;br /&gt;
	else&lt;br /&gt;
	printf(&amp;quot;\n\nThere isn't any square!\n\n&amp;quot;);&lt;br /&gt;
	fclose(text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Nat|Nat]] ([[User talk:Nat|talk]]) 18:05, 2 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
== Soluzione di rd ==&lt;br /&gt;
&lt;br /&gt;
Ho provato a risolvere il problema giocando con i bit.&lt;br /&gt;
Il risultato e' riportato qui sotto.&lt;br /&gt;
&lt;br /&gt;
E' compatto ma un po' contorto...&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* count the # of bits set to 1 in an unsigned int */&lt;br /&gt;
int countones(unsigned int x) {&lt;br /&gt;
  int count;&lt;br /&gt;
  for (count=0; x!= 0; x&amp;gt;&amp;gt;=1)&lt;br /&gt;
    count += x &amp;amp; 1;&lt;br /&gt;
  return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* if there is one sequence of 1, return the length of that seq*/&lt;br /&gt;
int seqlen(unsigned int x) {&lt;br /&gt;
  while (x != 0 &amp;amp;&amp;amp; (x &amp;amp; 1)==0)&lt;br /&gt;
    x &amp;gt;&amp;gt;= 1;&lt;br /&gt;
  return countones(x+1)==1?countones(x):0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j;&lt;br /&gt;
  char line[20];&lt;br /&gt;
  unsigned int values,vsum,hsum;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  if (dim&amp;gt;20 || dim&amp;lt;1)&lt;br /&gt;
    error_n_die(&amp;quot;invalid matrix size&amp;quot;);&lt;br /&gt;
  for (i=values=hsum=vsum=0; i&amp;lt;dim; i++) {&lt;br /&gt;
    unsigned int bline;&lt;br /&gt;
    fscanf(fin,&amp;quot;%s&amp;quot;,line);&lt;br /&gt;
    for (j=bline=0; j&amp;lt;dim; j++)&lt;br /&gt;
      bline = (bline &amp;lt;&amp;lt; 1) | (line[j] == '#');&lt;br /&gt;
    values |= 1&amp;lt;&amp;lt;countones(bline);&lt;br /&gt;
    hsum = (hsum &amp;lt;&amp;lt; 1) | (bline != 0);&lt;br /&gt;
    vsum |= bline;&lt;br /&gt;
  }&lt;br /&gt;
  values |= 1&amp;lt;&amp;lt;countones(vsum) | 1&amp;lt;&amp;lt;countones(hsum);&lt;br /&gt;
  values &amp;amp;= ~1;&lt;br /&gt;
  values |= 1&amp;lt;&amp;lt;seqlen(vsum) | 1&amp;lt;&amp;lt;seqlen(hsum);&lt;br /&gt;
  return countones(values) == 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
  &lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 07:54, 4 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Altre considerazioni e un'altra soluzione (rd) ==&lt;br /&gt;
&lt;br /&gt;
(NB: le indicazioni in '''Bold text''' sono esercizi da svolgere qui sul blog.)&lt;br /&gt;
&lt;br /&gt;
Ho riguardato i programmi proposti.&lt;br /&gt;
&lt;br /&gt;
La soluzione di LorenzoV ha un problema. Lui cerca i quattro vertici e poi controlla che tutti gli elementi all'interno siano '#'.&lt;br /&gt;
Se provate con questa configurazione:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
.....&lt;br /&gt;
.###.&lt;br /&gt;
####.&lt;br /&gt;
.###.&lt;br /&gt;
.....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
vi dice che e' un quadrato. Si potrebbe correggere il programma cambiando il modo per cercare i vertici... '''come'''?&lt;br /&gt;
&lt;br /&gt;
La soluzione di Nat invece funziona dal punto di vista algoritmico. Lui controlla che il numero di # sia un quadrato perfetto N^2 e quindi controlla che a partire dal primo # che si incontra scandendo la matrice in senso lessicografico tutti gli elementi nel quadrato a destra e in basso di lato N siano '#'.&lt;br /&gt;
&lt;br /&gt;
Pero'...&lt;br /&gt;
con questa configurazione:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
.....#####&lt;br /&gt;
##########&lt;br /&gt;
##########&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
il risultato e': Segmentation fault. '''Perch&amp;amp;eacute;?'''&lt;br /&gt;
&lt;br /&gt;
Inoltre se si fornisce una matrice vuota come:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
4&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dice che c'e' un quadrato (che sarebbe coerente, e' un quadrato di dimensione 0, ma secondo me le specifiche indicando &amp;quot;pieno&amp;quot; vogliono escludere questo caso).&lt;br /&gt;
&lt;br /&gt;
Ho poi un paio di commenti stilistici per Nat: la soluzione non rispetta le specifiche per il formato del file in input e usa un 'goto' non per casi di errore.&lt;br /&gt;
Il suo problema era &amp;quot;rompere&amp;quot; il doppio ciclo: '''come si puo' fare'''?&lt;br /&gt;
&lt;br /&gt;
Infine vi lascio questa altra soluzione.&lt;br /&gt;
Non usa alcuna memorizzazione per la matrice, neanche per una singola riga. Calcola se ci sia o meno un quadrato durante la lettura carattere per carattere.&lt;br /&gt;
Quindi anche se fosse data in input una matrice di un milione per un milione di elementi il programma userebbe sempre solo 8 interi.&lt;br /&gt;
&lt;br /&gt;
'''Chi ne descrive il funzionamento'''?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void flushtonl(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int c;&lt;br /&gt;
  while ((c=fgetc(fin)) != '\n' &amp;amp;&amp;amp; c!=EOF)&lt;br /&gt;
    ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j,c;&lt;br /&gt;
  int mini,maxi,minj,maxj;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  flushtonl(fin);&lt;br /&gt;
  mini=maxi=minj=maxj=-1;&lt;br /&gt;
  for (i=0; i&amp;lt;dim+1; i++) {&lt;br /&gt;
    int n=0;&lt;br /&gt;
    for (j=0; j&amp;lt;dim+1; j++) {&lt;br /&gt;
      c=(i&amp;lt;dim &amp;amp;&amp;amp; j&amp;lt;dim)?fgetc(fin):'.';&lt;br /&gt;
      if (mini&amp;lt;0) {&lt;br /&gt;
        if (c=='#') {&lt;br /&gt;
          if (minj&amp;lt;0) minj=j;&lt;br /&gt;
        } else {&lt;br /&gt;
          if (minj&amp;gt;=0) maxj=j-1,mini=i;&lt;br /&gt;
        }&lt;br /&gt;
      } else if (maxi&amp;lt;0) {&lt;br /&gt;
        if (c!='#' ^ (j &amp;lt; minj || j &amp;gt; maxj))&lt;br /&gt;
          if (c == '#' || j != minj)&lt;br /&gt;
            mini=maxi=minj=maxj=dim;&lt;br /&gt;
          else&lt;br /&gt;
            maxi=i-1;&lt;br /&gt;
      } else {&lt;br /&gt;
        if (c=='#')&lt;br /&gt;
          mini=maxi=minj=maxj=dim;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (i&amp;lt;dim) flushtonl(fin);&lt;br /&gt;
  }&lt;br /&gt;
  return maxj-minj == maxi-mini &amp;amp;&amp;amp; mini&amp;gt;=0 &amp;amp;&amp;amp; maxi&amp;lt;dim;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 12:45, 6 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
''c'era un bug. Ho corretto il confronto di riga 36 da &amp;quot;if (c == '#')&amp;quot; a &amp;quot;if (c == '#' || j != minj)&amp;quot;''.&lt;br /&gt;
'''Chi riesce a trovare il caso che non veniva correttamente riconosciuto? (spiegando il perch&amp;amp;eacute;!)'''&lt;br /&gt;
&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 20:30, 6 November 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Nat</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=793</id>
		<title>(Programma C) Un quadrato nella matrice</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=793"/>
		<updated>2014-11-02T17:05:36Z</updated>

		<summary type="html">&lt;p&gt;Nat: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
----&lt;br /&gt;
Questo è un problema uscito per le fasi di qualificazione della Facebook Hacker Cup 2014.&lt;br /&gt;
Il codice sorgente del programma di seguito riportato è in grado di riconoscere se in una matrice quadrata è presente un quadrato &amp;quot;pieno&amp;quot;: il programma accetta in '''input''' un file come da esempio:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
#...&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
####&lt;br /&gt;
#..#&lt;br /&gt;
#..#&lt;br /&gt;
####&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
.....&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dove il primo intero T indica il numero di casi (o test) e gli altri interi n indicano la grandezza di ogni matrice nxn.&amp;lt;br&amp;gt;&lt;br /&gt;
Valgono i seguenti vincoli: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ T ≤ 20&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ N ≤ 20&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Seguendo questo esempio, in '''output''' il programma stamperà le seguenti righe:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Case #1: YES&lt;br /&gt;
Case #2: NO&lt;br /&gt;
Case #3: NO&lt;br /&gt;
Case #4: NO&lt;br /&gt;
Case #5: YES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La matrice n. 2 contiene un # fuori dal quadrato, la matrice n. 3 contiene un quadrato non riempito e la matrice n. 4 contiene un rettangolo.&amp;lt;br&amp;gt;&lt;br /&gt;
Ecco il codice della mia soluzione:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct coordinate{&lt;br /&gt;
    int x;&lt;br /&gt;
    int y;&lt;br /&gt;
}coord;&lt;br /&gt;
&lt;br /&gt;
int max(int x, int y){&lt;br /&gt;
    if (x&amp;gt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int min(int x, int y){&lt;br /&gt;
    if (x&amp;lt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	FILE *fin;&lt;br /&gt;
	const int N=20;&lt;br /&gt;
	int i, j, k, h, n, T, M[N][N];&lt;br /&gt;
	int acase, find;&lt;br /&gt;
	coord asx, adx, bsx, bdx;&lt;br /&gt;
	char str[N];&lt;br /&gt;
	fin = fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
	if (fin == NULL){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Error opening file\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;T);&lt;br /&gt;
	if (T&amp;gt;20 || T&amp;lt;1){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Number of test cases not valid\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	for (k=0; k&amp;lt;T; k++){&lt;br /&gt;
        fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
        if (n&amp;gt;N){&lt;br /&gt;
            fprintf(stderr, &amp;quot;Number of cells too high\n&amp;quot;);&lt;br /&gt;
            exit(1);&lt;br /&gt;
        }&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(fin, &amp;quot;%s&amp;quot;, &amp;amp;str);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++){&lt;br /&gt;
                M[i][j]=str[j];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        asx.x=asx.y=-1;&lt;br /&gt;
        adx.x=adx.y=-1;&lt;br /&gt;
        bsx.x=bsx.y=-1;&lt;br /&gt;
        bdx.x=bdx.y=-1;&lt;br /&gt;
        /*Angolo in alto a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    asx.x=i;&lt;br /&gt;
                    asx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in alto a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    adx.x=i;&lt;br /&gt;
                    adx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bsx.x=i;&lt;br /&gt;
                    bsx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bdx.x=i;&lt;br /&gt;
                    bdx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Verifico che non sia un rettangolo*/&lt;br /&gt;
        acase=1;&lt;br /&gt;
        if (max(bsx.x, bdx.x)-min(asx.x, adx.x)!=max(bsx.y, bdx.y)-min(asx.y, adx.y)){&lt;br /&gt;
            acase=0;&lt;br /&gt;
        } else {&lt;br /&gt;
            /*Verifico se il quadrato è pieno*/&lt;br /&gt;
            for (i=min(asx.x, adx.x); i&amp;lt;=max(bsx.x, bdx.x); i++){&lt;br /&gt;
                for (j=min(asx.y, adx.y); j&amp;lt;=max(bsx.y, bdx.y); j++){&lt;br /&gt;
                    if (M[i][j]!='#'){&lt;br /&gt;
                        acase=0;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (acase) printf(&amp;quot;Case #%i: YES\n&amp;quot;, k+1);&lt;br /&gt;
        else printf(&amp;quot;Case #%i: NO\n&amp;quot;, k+1);&lt;br /&gt;
	}&lt;br /&gt;
	fclose(fin);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:LorenzoV|LorenzoV]] ([[User talk:LorenzoV|talk]]) 17:25, 1 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il codice che posto qui di seguito verifica che nella matrice presa in input da file ci sia un quadrato pieno, ma attraverso controlli diversi rispetto al codice precedente e con una matrice allocata dinamicamente (si possono passare in input matrici più grandi di 20*20).&lt;br /&gt;
Il programma prende in input un file in questa forma&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
###..&lt;br /&gt;
###..&lt;br /&gt;
###..&lt;br /&gt;
.....&lt;br /&gt;
.....&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dove 5 è il numero di colonne(righe) della matrice n*n. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se compilate con gcc va aggiunto  il flag -lm perchè con la libreria math.h (per la radice quadrata) ci sono problemi. &amp;lt;br&amp;gt;&lt;br /&gt;
Es. gcc main.c -o programma -lm&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	FILE *text;&lt;br /&gt;
    	int n,i,j,counter,tmp,isx,jsx;&lt;br /&gt;
	double squaroot; counter=0;&lt;br /&gt;
	text=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    	if(text==NULL)&lt;br /&gt;
    	{&lt;br /&gt;
        	fprintf(stderr, &amp;quot;Invalid input.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
    	}&lt;br /&gt;
	&lt;br /&gt;
	/*Leggo la dimensione n della matrice in input*/&lt;br /&gt;
    	fscanf(text,&amp;quot;%d&amp;quot;,&amp;amp;n);&lt;br /&gt;
    &lt;br /&gt;
	/*Alloco una matrice M e un vettore r, che mi serve&lt;br /&gt;
	 per copiare l'input su M. &lt;br /&gt;
	In seguito setto tutto con un '.'*/&lt;br /&gt;
    	char **M;&lt;br /&gt;
    	M=(char**)malloc(n * sizeof(char*));&lt;br /&gt;
    	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
    	{M[i]=(char*)malloc(n * sizeof(char));}&lt;br /&gt;
&lt;br /&gt;
    	char *r;&lt;br /&gt;
    	r=(char*)malloc(n*sizeof(char));&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
		r[i]='.';&lt;br /&gt;
		for(j=0;j&amp;lt;n;j++)&lt;br /&gt;
			M[i][j]='.';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(text, &amp;quot;%s&amp;quot;, r);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
	               M[i][j]=r[j];          &lt;br /&gt;
	}&lt;br /&gt;
	/*Stampa matrice*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
			printf(&amp;quot;%c&amp;quot;,M[i][j]);&lt;br /&gt;
&lt;br /&gt;
		printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	/*Conto i cancelletti*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
		{&lt;br /&gt;
			if(M[i][j]=='#')&lt;br /&gt;
			counter++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	/*Logicamente si ha che se il numero &lt;br /&gt;
	di cancelletti non è un numero quadrato&lt;br /&gt;
	allora la matrice non potrà mai contenere un quadrato pieno.*/&lt;br /&gt;
	squaroot=sqrt(counter);&lt;br /&gt;
	if(squaroot!=(int)squaroot)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;\nThere isn't any square.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Cerco il primo cancelletto,&lt;br /&gt;
	che sarà sicuramente il mio angolo &lt;br /&gt;
	in alto a sinistra del &lt;br /&gt;
	mio potenziale quadrato*/&lt;br /&gt;
&lt;br /&gt;
	for(i=0;i&amp;lt;n;i++)&lt;br /&gt;
	{&lt;br /&gt;
       		 for(j=0;j&amp;lt;n;j++)&lt;br /&gt;
        	{&lt;br /&gt;
            		if(M[i][j]=='#')&lt;br /&gt;
            			goto final;&lt;br /&gt;
        	}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Valuto solo la parte di matrice &lt;br /&gt;
	che inizia con il mio angolo sx&lt;br /&gt;
	, &amp;quot;spazzolo&amp;quot; solo per la lunghezza &lt;br /&gt;
	del mio lato(radice quadrata del numero di cancelletti)&lt;br /&gt;
	e scalo il numero dei cancelletti: se alla fine sono 0 vuol dire&lt;br /&gt;
	che nello spazio k*k (k&amp;lt;=n) ho trovato esattamente k*k cancelletti e non ce ne sono altri.&lt;br /&gt;
	Quindi è un quadrato pieno. */&lt;br /&gt;
	&lt;br /&gt;
	final:&lt;br /&gt;
	isx=i; jsx=j; tmp=counter;&lt;br /&gt;
&lt;br /&gt;
	for(i=isx;i&amp;lt;(isx+(int)squaroot);i++)&lt;br /&gt;
	{&lt;br /&gt;
	        for(j=jsx;j&amp;lt;(jsx+(int)squaroot);j++)&lt;br /&gt;
	        {&lt;br /&gt;
	            if(M[i][j]=='#')&lt;br /&gt;
	            tmp--;&lt;br /&gt;
	        }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(tmp==0)&lt;br /&gt;
	printf(&amp;quot;\n\nThere is a square! :D\n\n&amp;quot;);&lt;br /&gt;
	else&lt;br /&gt;
	printf(&amp;quot;\n\nThere isn't any square!\n\n&amp;quot;);&lt;br /&gt;
	fclose(text);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Nat|Nat]] ([[User talk:Nat|talk]]) 18:05, 2 November 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Nat</name></author>
	</entry>
</feed>