#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define n 4

void init(int mat[n][n],int m);
void stampa(int mat[n][n],int m);
int leggifile(int mat[n][n], int m, char filename[]);
void stampafile(int mat[n][n], int m, char filename[]);
void chiediutente(int indici[4], int m); 
int sposta(int mat[n][n], int indici[4]);

int main()
{
	int mat[n][n];
	int indici[4];
	srand(time(NULL));
	init(mat,n);
	stampa(mat,n);
	chiediutente(indici,n);
	sposta(mat,indici);
	stampa(mat,n);
	
	}

int sposta(int mat[n][n], int indici[4])
{
	int sposta_verticale,sposta_orizzontale;
	if(mat[indici[2]][indici[3]]!=0)
	  return 0;
	else {
		 sposta_verticale = ((indici[0]==indici[2]) && (abs(indici[1]-indici[3])==1)) ;
		 sposta_orizzontale = ((indici[1]==indici[3]) && (abs(indici[0]-indici[2])==1));
	    if(sposta_verticale || sposta_orizzontale)
	      {
			  mat[indici[2]][indici[3]]= mat[indici[0]][indici[1]];
			   mat[indici[0]][indici[1]]=0;
			   return 1;
		  }
		  else 
            return 0;
		}
	
	}


void chiediutente(int indici[4], int m)
{
	do{
	  printf("inserisci i di partenza: \n");
	  scanf("%d",&indici[0]);
      }while(indici[0]<0 || indici[0]>=m);
      
	printf("inserisci j di partenza: \n");
	scanf("%d",&indici[1]);
	printf("inserisci i di destinazione: \n");
	scanf("%d",&indici[2]);
	printf("inserisci j di destinazione: \n");
	scanf("%d",&indici[3]);
	
	}

	
void init(int mat[n][n],int m)
{
	int v[n*n];
	int x =m*m;
	int p_ele;
	for (int i=0;i<x;i++) v[i]=i;
	for(int i=0;i<m;i++)
	  for(int j=0;j<m;j++)
	      {
			  p_ele=random()%x;
			  mat[i][j]=v[p_ele];
			  v[p_ele]=v[x-1];
			  x--;
			  
			  }
	
	
	
	
	}
	
void stampa(int mat[n][n],int m){
	for( int i=0;i<m;i++)
	 { printf("\n");
		 for(int j=0;j<m;j++)
		 if(mat[i][j]!=0)
		   printf("%d\t",mat[i][j]);
		 else
		   printf(" \t");
		   
	   }
	
	}