Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* /0 1 2 [0] 4 2 4------ */
- /* 3 4 3 5 3 [0] 3------- */
- /* 2 [0] 3 3 2 4 2------ */
- /* 2 1 [0] 4 5 3 4------- */
- /* [0] 1 2 3 /0 1 3 */
- /* 2 3 2 3 5 5 [0] -------- */
- /* 3 /0 /0 1 [0] 3 5 */
- /* | */
- /* | */
- /* | */
- /* 20 */
- #include <stdio.h>
- #include <stdbool.h>
- #define zerobarre -1
- #define zeroencadre -2
- void liretableau(int(*)[100], int);
- void savetab(int(*)[100], int(*)[100], int);
- void reduire(int(*)[100], int);
- bool fini(int(*)[100], int);
- int minligne(int*, int);
- int mincol(int(*)[100], int, int);
- void retminlig(int(*)[100], int);
- void retmincol(int(*)[100], int);
- int nbzerononbar(int*, int);
- int choilig(int(*)[100], int);
- int encadr(int(*)[100], int, int);
- void barrer(int(*)[100], int, int, int);
- bool peutbarrer(int(*)[100], int);
- void encetbarr(int(*)[100], int);
- void marqulig(int(*)[100], bool*, int);
- int marqucolig(int(*)[100], bool*, bool*, int);
- int marquligol(int(*)[100], bool*, bool*, int);
- void marqetbar(int(*)[100], int(*)[100], int);
- int detmintab(int(*)[100], int(*)[100], int);
- void retmintab(int(*)[100], int(*)[100], int, int);
- void ajoutertabdeuf(int(*)[100], int(*)[100], int, int);
- void etape3(int(*)[100], int(*)[100], int);
- int finir(int(*)[100], int(*)[100], int);
- void ecriretableau(int(*)[100], int);
- int main(void)
- {
- int tab[100][100], tabbak[100][100];
- int taille;
- int barre[100][100];
- scanf("%d",&taille);
- for(int i=0;i<taille;i++)
- for(int j=0;i<taille;i++)
- barre[i][j]=0;
- liretableau(tab,taille);
- savetab(tab, tabbak, taille);
- reduire(tab,taille);
- while(!fini(tab, taille))
- {
- encetbarr(tab, taille);
- if(!fini(tab, taille))
- {
- marqetbar(tab, barre, taille);
- etape3(tab, barre, taille);
- }
- }
- ecriretableau(tab, taille);
- printf("%d\n",finir(tab, tabbak, taille));
- return 0;
- }
- void liretableau(int tab[][100], int taille)
- {
- for(int i=0;i<taille;i++)
- for(int j=0;j<taille;j++)
- scanf("%d",&(tab[i][j]));
- }
- void savetab(int tab[][100], int tabbak[][100], int taille)
- {
- for(int i=0;i<taille;i++)
- for(int j=0;j<taille;j++)
- tabbak[i][j]=tab[i][j];
- }
- int minligne(int* ligne, int taille)
- {
- int min=ligne[0];
- for(int i=1;i<taille;i++)
- if(ligne[i]<min)
- min=ligne[i];
- return min;
- }
- int mincol(int tab[][100], int col, int taille)
- {
- int min=tab[0][col];
- for(int i=1;i<taille;i++)
- if(tab[i][col]<min)
- min=tab[i][col];
- return min;
- }
- void retminlig(int tab[][100], int taille)
- {
- int min;
- for(int i=0;i<taille;i++)
- {
- min=minligne(tab[i],taille);
- for(int j=0;j<taille;j++)
- tab[i][j]-=min;
- }
- }
- void retmincol(int tab[][100], int taille)
- {
- int min;
- for(int i=0;i<taille;i++)
- {
- min=mincol(tab,i,taille);
- for(int j=0;j<taille;j++)
- tab[j][i]-=min;
- }
- }
- void reduire(int tab[][100], int taille)
- {
- retminlig(tab,taille);
- retmincol(tab,taille);
- }
- int nbzerononbar(int* ligne, int taille)
- {
- int nb=0;
- for(int i=0;i<taille;i++)
- if(ligne[i]==0 || ligne[i]==zeroencadre)
- nb++;
- return nb;
- }
- int choilig(int tab[][100], int taille)
- {
- int min=nbzerononbar(tab[0], taille), minind=0;
- for(int i=1;i<taille;i++)
- if(nbzerononbar(tab[i],taille)<min)
- {
- min=nbzerononbar(tab[i],taille);
- minind=i;
- }
- return minind;
- }
- int encadr(int tab[][100], int ligne, int taille)
- {
- int i;
- while(tab[ligne][i]!=0 && i<taille)
- i++;
- tab[ligne][i]=zeroencadre;
- return i;
- }
- void barrer(int tab[][100], int ligne, int col, int taille)
- {
- for(int i=0;i<taille;i++)
- {
- if(tab[ligne][i]==0)
- tab[ligne][i]=zerobarre;
- if(tab[i][col]==0)
- tab[i][col]=zerobarre;
- }
- }
- bool peutbarrer(int tab[][100], int taille)
- {
- return (nbzerononbar(tab[choilig(tab, taille)],taille)!=0);
- }
- void encetbarr(int tab[][100], int taille)
- {
- int l, k;
- while(peutbarrer(tab, taille))
- {
- l=choilig(tab, taille);
- k=encadr(tab, l, taille);
- barrer(tab, l, k, taille);
- }
- }
- bool fini(int tab[][100], int taille)
- {
- int nb;
- for(int i=0;i<taille;i++)
- {
- nb=0;
- for(int j=0;j<taille;j++)
- if(tab[i][j]==zeroencadre)
- nb++;
- /* if(nb!==1) */
- /* return false;*/
- }
- for(int i=0;i<taille;i++)
- {
- nb=0;
- for(int j=0;j<taille;j++)
- if(tab[j][i]==zeroencadre)
- nb++;
- /* if(nb!==1) */
- /* return false; */
- /* j'ai pas vraiment cherché à comprendre ton programme mais je pense que ton erreur vient de là */
- }
- return true;
- }
- int nbzeroencad(int* ligne, int taille)
- {
- int nb=0;
- for(int i=0;i<taille;i++)
- if(ligne[i]==zeroencadre)
- nb++;
- return nb;
- }
- void marqulig(int tab[][100], bool* tablignes, int taille)
- {
- for(int i=0;i<taille;i++)
- if(nbzeroencad(tab[i], taille)==0)
- tablignes[i]=true;
- }
- int marqucolig(int tab[][100], bool* tablignes, bool* tabcol, int taille)
- {
- int som=0;
- for(int i=0;i<taille;i++)
- if(tablignes[i]==true)
- for(int j=0;j<taille;j++)
- if(tab[i][j]==zerobarre)
- if(tabcol[j]==false)
- {
- tabcol[j]=true;
- som++;
- }
- return som;
- }
- int marquligol(int tab[][100], bool* tablignes, bool* tabcol, int taille)
- {
- int som=0;
- for(int i=0;i<taille;i++)
- if(tabcol[i]==true)
- for(int j=0;j<taille;j++)
- if(tab[j][i]==zeroencadre)
- if(tablignes[j]==false)
- {
- tablignes[j]=true;
- som++;
- }
- return som;
- }
- void marqetbar(int tab[][100], int barre[][100], int taille)
- {
- int k,l;
- bool tablignes[taille], tabcol[taille];
- for(int i=0;i<taille;i++)
- tablignes[i]=tabcol[i]=false;
- marqulig(tab, tablignes, taille);
- do
- {
- l=marqucolig(tab, tablignes, tabcol, taille);
- k=marquligol(tab, tablignes, tabcol, taille);
- }
- while(k!=0 || l!=0);
- for(int i=0;i<taille;i++)
- if(tablignes[i]==true)
- for(int j=0;j<taille;j++)
- barre[i][j]++;
- for(int i=0;i<taille;i++)
- if(tabcol[i]==true)
- for(int j=0;j<taille;j++)
- barre[j][i]++;
- }
- int detmintab(int tab[][100], int barre[][100], int taille)
- {
- int min,k=0,l=0;
- bool premin=false;
- while(k<taille && premin==false)
- {
- while(l<taille && premin==false)
- {
- if(barre[k][l]!=2)
- {
- min=tab[k][l];
- premin=true;
- }
- l++;
- }
- k++;
- }
- for(int i=0;i<taille;i++)
- for(int j=0;j<taille;j++)
- if(barre[i][j]!=2 && tab[i][j]<min)
- min=tab[i][j];
- return min;
- }
- void retmintab(int tab[][100], int barre[][100], int min, int taille)
- {
- for(int i=0;i<taille;i++)
- for(int j=0;j<taille;j++)
- if(barre[i][j]!=2)
- tab[i][j]-=min;
- }
- void ajoutertabdeuf(int tab[][100], int barre[][100], int min, int taille)
- {
- for(int i=0;i<taille;i++)
- for(int j=0;j<taille;j++)
- if(barre[i][j]==2)
- tab[i][j]+=min;
- }
- void etape3(int tab[][100], int barre[][100], int taille)
- {
- int m;
- m=detmintab(tab, barre, taille);
- retmintab(tab, barre, m, taille);
- ajoutertabdeuf(tab, barre, m, taille);
- }
- int finir(int tab[][100], int tabbak[][100], int taille)
- {
- int som=0;
- for(int i=0;i<taille;i++)
- for(int j=0;j<taille;j++)
- if(tab[i][j]==zeroencadre)
- som+=tabbak[i][j];
- return som;
- }
- void ecriretableau(int tab[][100], int taille)
- {
- for(int i=0;i<taille;i++)
- for(int j=0;j<taille;j++)
- {
- printf("%d ",tab[i][j]);
- if(j==(taille-1))
- printf("\n");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement