Другие языки программирования и технологии
Подскажите пожалуйста как такую задачу на СИ решать?
Назовем допустимым преобразованием матрицы перестановку двух соседних строк или двух соседних столбцов. Дана действительная квадратная матрица порядка 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);
}
// Нужен исходник - звони! Вечером буду дома.
#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);
}
// Нужен исходник - звони! Вечером буду дома.
А вообще-то задачка не простая, а с подвохом! :)
#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]);
}
#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]);
}
И что тут сложного? Алгоритм вполне понятен. Остаётся только на си написать программу. Или с линейной алгеброй туго?
Похожие вопросы
- Подскажите пожалуйста решение такой задачи.
- Помогите решить задачи на Си! Пожалуйста!!!
- Помогите с задаче в СИ
- Си. scanf(). не пойму почему не считываются значения. Подскажите, пожалуйста.
- Мне задали сделать задачу по Turbo Pascal, но я забыл что нужно писать в var и READ. подскажите пожалуйста.
- Подскажите пожалуйста как включить диспечер задач!!??
- Проблема с задачей с паскале, подскажите пожалуйста где неправельно и как ошибку исправить
- Помогите пожалуйста создать программу "Таймер" на СИ. Заранее всем благодарен!)
- Объясните, пожалуйста, как решить задачу по информатике...
- Подскажите пожалуйста еще с одной программой, тут я вобще не знаю с чего начинать, язык СИ!!!!А не с++