我正在解决此算法问题,但我无法找到所提供的参考答案。任何有关解决此问题的帮助或提示都表示赞赏。
问题陈述如下 在大小为N×N的区域中,每个小区在时间T = 0时包含1,其中1代表一个用户。
Hence, at T= 0 and N = 5 the matrix is as below
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
Each cell is a user.
Now at time T =1,2,3 etc the position of each user changes.
if x(row)+y(col) = even
New x = (x+y)^2%N
New y = (x*y)%N
if x(row)+y(col) = odd
New x = (x+y)%N
New y = |x-y|%N
在时间T = 3时查找最大用户数 参考,对于N = 5和T = 3,单元格中的最大用户应为8。
我已经尝试过解决这个问题,但是如果我移动所有用户,我总是以11为最大值,如果每次只移动1个用户,则最终为6。 我非常感谢您在理解或解决此问题时可能出错的任何提示。谢谢。 下面是我用来解决这个问题的代码 它采用C编程语言。提前谢谢。
int abs(int y, int x)
{
int temp = x - y;
return temp > 0 ? temp : -temp;
}
int new_x(int x, int y, int n)
{
if((x+y)%2)
return (((x+y)*(x+y))%n);
else
return (x+y)%n;
}
int new_y(int x, int y, int n)
{
if((x+y)%2)
return (x*y)%n;
else
return ((abs(x,y))%n);
}
void print_matrix(int *p, int n, int time)
{
int i,j;
int sum = 0;
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
printf("%d\t",*((p+i*n)+j));
sum += *((p+i*n)+j);
}
printf("\n");
}
printf("Sum = %d\t at T=%d\n",sum, time);
}
int main(void)
{
int T = 3;
int N = 5;
int test_case,i,j,x,y,item, sum, val;
int arr_initial[5][5];
//====================================
//For Time T=0 all elements are 1
//====================================
for(i=0;i<N;i++){
for(j=0;j<N;j++) {
arr_initial[i][j] = 1;
}
}
//=====================================
printf("Initial Matrix at T0 time\n");
print_matrix((int*)arr_initial, N, 0);
printf("\n");
//====================================
//Now calculate the new position for Time T1,T2 & T3
//====================================
for(test_case =1; test_case<=T;test_case++)
{
sum = 0;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{//Get NewX and NewY for movement
x = new_x(i,j,N);
y = new_y(i,j,N);
if(x==i && y==j)
{
//No movement as initial and new position is same
}
else{
//There is a movement
item = arr_initial[i][j];
val = item -1;
if(val<0)
{
//no item to move
}
else
{
arr_initial[x][y] += arr_initial[i][j];
arr_initial[i][j] = 0;
}
}
}
}
//=======================================================
printf("\n");
printf("Matrix at Time T = %d\n",test_case);
print_matrix((int*)arr_initial, N, test_case);
printf("\n");
}
return 0;
}
答案 0 :(得分:1)
您的任务声明与代码不同 - 您说(x*y)^2
但实施(x+y)^2
。该解决方案通过在单独的阵列中构建下一代来实现。
#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 5
int main(void) {
char matrix[N][N], next[N][N];
int x, y, t, x2, y2, max;
memset(matrix, 1, sizeof(matrix)); // initialise matrix
for(t=0; t<3; t++) {
memset(next, 0, sizeof(next)); // clear next generation
for (y=0; y<N; y++)
for (x=0; x<N; x++) {
if ((x + y) % 2 == 0) {
x2 = ((x + y) * (x + y)) % N;
y2 = (x * y) % N;
} else {
x2 = (x + y) % N;
y2 = abs(x - y) % N;
}
next[y2][x2] += matrix[y][x];
}
memcpy(matrix, next, sizeof(matrix)); // copy back
}
max = 0;
for (y=0; y<N; y++) { // print matrix
for (x=0; x<N; x++) {
if (max < matrix[y][x])
max = matrix[y][x];
printf("%-3d", matrix[y][x]);
}
printf ("\n");
}
printf ("Max is %d\n", max);
return 0;
}
节目输出:
1 0 0 0 0
0 2 0 0 4
0 0 0 0 0
4 8 0 4 0
0 2 0 0 0
Max is 8
答案 1 :(得分:0)
1)你错误地计算了(x + y)是奇数。如果(x + y)%2为真,则x + y为奇数。因此:
int new_x(int x, int y, int n)
{
if((x+y)%2)
return (((x+y)*(x+y))%n);
else
return (x+y)%n;
}
int new_y(int x, int y, int n)
{
if((x+y)%2)
return (x*y)%n;
else
return ((abs(x,y))%n);
}
应更改为:
int new_x(int x, int y, int n)
{
if((x+y)%2)
return (x+y)%n;
else
return (((x+y)*(x+y))%n);
}
int new_y(int x, int y, int n)
{
if((x+y)%2)
return ((abs(x,y))%n);
else
return (x*y)%n;
}
2)您更改了数组中可能仍未处理的字段:
arr_initial[x][y] += arr_initial[i][j];
您需要使用另一个初始化为0的矩阵来跟踪其中的新值,并在每个步骤结束时将更改复制回原始矩阵。
答案 2 :(得分:0)
问题是你正在从数组中读取值,并且值可能已被修改,这将成为T + 1的值!
因此,您需要另一个数组来跟踪T的值。这是一个想法:
for(i = 0; i < N; i ++)
for (j = 0; j < N; j ++)
alter_arr[i][j] = current_arr[i][j];
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{//Get NewX and NewY for movement
x = new_x(i,j,N);
y = new_y(i,j,N);
printf("%d, %d moved to %d, %d\n", i, j, x, y);
if(x==i && y==j)
{
// no movement
}
else{
//There is a movement
item = current_arr[i][j];
val = item -1;
if(val<0)
{
//no item to move
}
else
{
alter_arr[x][y] += current_arr[i][j];
alter_arr[i][j] -= current_arr[i][j];
}
}
}
}
int (*tmp)[5] = current_arr;
current_arr = alter_arr;
alter_arr = tmp;
//=======================================================
printf("\n");
printf("Matrix at Time T = %d\n",test_case);
并更改new_x和new_y函数中的if语句。
结果如下,在T = 3时最大值为8:
Initial Matrix at T0 time
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
Sum = 25 at T=0
Matrix at Time T = 1
1 2 0 2 0
2 2 0 4 2
0 2 0 0 0
0 2 0 2 0
2 2 0 0 0
Sum = 25 at T=1
Matrix at Time T = 2
1 0 0 4 0
2 4 0 6 2
0 0 0 0 0
0 2 0 2 0
0 2 0 0 0
Sum = 25 at T=2
Matrix at Time T = 3
1 0 0 4 0
0 2 0 8 2
0 0 0 0 0
0 0 0 4 0
0 4 0 0 0
Sum = 25 at T=3