Другие языки программирования и технологии

Подскажите пожалуйста как такую задачу на СИ решать?

Назовем допустимым преобразованием матрицы перестановку двух соседних строк или двух соседних столбцов. Дана действительная квадратная матрица порядка n. С помощью допустимых преобразований добиться того, чтобы элемент матрицы, обладающий наименьшим значением, располагался в правом нижнем углу матрицы.
// ~ЯнОчК@~_2011-11-01
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <windows.h>
#include <time.h>

#define N 5

void main()
{
setlocale(LC_CTYPE, "Russian_Russia.1251");

srand((unsigned) time(NULL));

int Array[N][N] = {201, 201};

do
{
system("cls");

int min = Array[0][0], columnIndex = 0, lineIndex = 0;

printf("\n Исходный массив: \n");

for (int n = 0; n < N; n++)
{
printf("\n");

for (int m = 0; m < N; m++)
{
Array[n][m] = rand() % 101 + 100;

printf(" %d \t", Array[n][m]);

if (min > Array[n][m])
{
min = Array[n][m];
columnIndex = m;
lineIndex = n;
}
}
}

printf("\n\n min = %d \t lineIndex = %d \t columnIndex = %d", min, lineIndex, columnIndex);

int temp, count = 0;

if (lineIndex < N - 1)
{
for (int n = lineIndex; n < N - 1; n++)
{
for (int m = 0; m < N; m++)
{
temp = Array[n + 1][m];
Array[n + 1][m] = Array[lineIndex][m];
Array[lineIndex][m] = temp;
}

count++;
lineIndex++;

printf("\n\n Результат после %d-го преобразования: \n", count);

for (int n = 0; n < N; n++)
{
printf("\n");

for (int m = 0; m < N; m++) printf(" %d \t", Array[n][m]);
}
}
}

if (columnIndex < N - 1)
{
for (int n = columnIndex; n < N - 1; n++)
{
for (int m = 0; m < N; m++)
{
temp = Array[m][n + 1];
Array[m][n + 1] = Array[m][columnIndex];
Array[m][columnIndex] = temp;
}

count++;
columnIndex++;

printf("\n\n Результат после %d-го преобразования: \n", count);

for (int n = 0; n < N; n++)
{
printf("\n");

for (int m = 0; m < N; m++) printf(" %d \t", Array[n][m]);
}
}
}

getch();
}
while (1);
}

// Нужен исходник - звони! Вечером буду дома.
Каныбек Адырбаев
Каныбек Адырбаев
85 085
Лучший ответ
А вообще-то задачка не простая, а с подвохом! :)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define CONST 100
int dop_pr(int** p,int n,int r,int c)
{
int j,k=0;
if(r > 0&&c < 0) for(r?1:r=1,j=0;j < n;j++) p[r][j]^=p[r-1][j],p[r-1][j]^=p[r][j],p[r][j]^=p[r-1][j];
else
if(c > 0&&r < 0) for(c?1:c=1,j=0;j < n;j++) p[j][c]^=p[j][c-1],p[j][c-1]^=p[j][c],p[j][c]^=p[j][c-1];
else k=1;
return k;
}
int minr(int** p,int n,int r,int& k)
{
int j,min=CONST;
for(k=j=0;j < n;j++) if(p[r][j] <= min) min=p[r][k=j];
return min;
}
int minc(int** p,int n,int c,int& k)
{
int j,min=CONST;
for(k=j=0;j < n;j++) if(p[j][c] <= min) min=p[k=j][c];
return min;
}
void main()
{
int j,k,n,j1,j2;
int** p;
int* m,*t;
srand(time(NULL));
printf("n="); scanf("%d",&n);
p=(int**)malloc(n*sizeof(int*));
m=(int*)malloc(n*n*sizeof(int));
for(j=0;j < n;p[j++]=m+j*n);
for(t=m,j=0;j < n*n;j++) *t++=rand()%CONST;
for(j=0;j < n;j++,printf("\n")) for(k=0;k < n;k++) printf("%d\t",p[j][k]);
printf("\n");
for(j=1;j < n;j++) if(minr(p,n,j,j1) > minr(p,n,j-1,j2)) dop_pr(p,n,j,-1); else if(minr(p,n,j,j1) == minr(p,n,j-1,j2) && j1 < j2) dop_pr(p,n,j,-1);
for(j=1;j < n;j++) if(minc(p,n,j,j1) > minc(p,n,j-1,j2)) dop_pr(p,n,-1,j); else if(minc(p,n,j,j1) == minc(p,n,j-1,j2) && j1 < j2) dop_pr(p,n,-1,j);
for(j=0;j < n;j++,printf("\n")) for(k=0;k < n;k++) printf("%d\t",p[j][k]);
}
Stop Stopp
Stop Stopp
76 473
И что тут сложного? Алгоритм вполне понятен. Остаётся только на си написать программу. Или с линейной алгеброй туго?