他说我时间超出和存储器范围超出,但我不知道怎么改,求助
查看原帖
他说我时间超出和存储器范围超出,但我不知道怎么改,求助
1399976
Whz1305368586楼主2024/7/22 20:20

/*

  • 基本思路: 循环为基底, 每一次循环都代表两个人握手,循环内判断:
  • 1.是朋友则握手次数加一,continue结束本次循环
  • 2.是敌人则握手次数不变,continue结束本次循环
  • 3.是陌生人则进入 判断是否存在 w 同时是一方的朋友和另一方的敌人 (可以封个函数)
  •   判断方式:
    
  •  (1). 进入循环,找到他所有的朋友和敌人
    
  •  (2). 检索他所有朋友的敌人和所有敌人的朋友,与当前预握手的人对比
    
  •  (3). 若上述两种情况匹配成功,不握手,不成功,握手。
    
    1. 输出握手数

*/


#include <stdio.h>

int main(int argc, const char * argv[])
{

   int n = 0;        
   int p = 0;         
   int q = 0;         
   int count = 0;     
   int u = 0;
   int v = 0; 
   
   scanf("%d %d %d\n", &n, &p, &q); 
   
   int friend_arr[n][n];     /*存储朋友/敌人关系的数组,计划中,若二人为某种关系,则对应位置的值为1 */
   int enemy_arr[n][n];     //比如 1 和 3 为朋友,则friend_arr[1][3] = 1 且 friend_arr[3][1] = 1
   
   for (int i = 0; i < n; i++)          //初始化数组,因为是二维数组并且上限要求用户输入所以无法使用函数 
   {
   	for (int j = 0; j < n; j++)
   	{
   		friend_arr[i][j] = 0;
   		enemy_arr[i][j]  = 0;
   	}
   }
   
   //1. 从键盘赋值数据 (以下步骤在学完指针后可以封装成函数)  
   for (int i = 0; i < p; i++)         //朋友数组添加数据 本循环用于添加p条朋友关系 
   {
   	scanf("%d %d", &u, &v);
   	for (int j = 0; j < n; j++)     //这两个循环则是为了在输入的位置添加数据 
   	{
   		for (int k = 0; k < n; k++)
   		{
   			if (j == u - 1 && k == v - 1)     //+1的原因: 数组是从下标0开始的,而对人的编号则是从1开始 
   			{
   				friend_arr[k][j] = 1;
   				friend_arr[j][k] = 1;
   			}
   			else if (j == v - 1 && k == u - 1)
   			{
   				friend_arr[k][j] = 1;
   				friend_arr[j][k] = 1;
   			}
   		}
   	}
   }
   
   for (int i = 0; i < q; i++)         //朋友数组添加数据 本循环用于添加q条敌人关系 
   {
   	scanf("%d %d", &u, &v);
   	for (int j = 0; j < n; j++)     //这两个循环则是为了在输入的位置添加数据 
   	{
   		for (int k = 0; k < n; k++)
   		{
   			if (j == u - 1 && k == v - 1)
   			{
   				enemy_arr[k][j] = 1;
   				enemy_arr[j][k] = 1;
   			}
   			else if (j == v - 1 && k == u - 1)
   			{
   				enemy_arr[k][j] = 1;
   				enemy_arr[j][k] = 1;
   			}
   		}
   	}
   }
   
   /*2. 握手判断【核心】*/ 
   for (int i = 0; i < n; i++)
   {
   	for (int j = i + 1; j < n; j++)    
   	{								  
   		if (friend_arr[i][j] == 1)
   		{
   			count += 1;               //是朋友,握手 
   		}
   		else if (enemy_arr[i][j] == 1)
   		{
   			continue;                 //是敌人,不握手,继续下一个循环 
   		}
   		else
   		{                             //陌生人,判断有没有一人的朋友是另一人的敌人
   			for (int k = 0; k < n; k++) //这里照样该封函数,只是目前不会 这里不是i+1,因为我要的是他所有的敌友 
   			{
   				if (friend_arr[i][k] == 1 && enemy_arr[j][k] == 1)
   				{
   					break;	 
   				}
   				else if (enemy_arr[i][k] == 1 && friend_arr[j][k] == 1)
   				{
   					break;
   				}
   				else if (k == n-1)           //k循环完了,没有出现k同时是一人的朋友和另一人的敌人,i j握手					 
   				{
   					count += 1;              
   				}
   			}
   		}
   	} 
   }
   
   printf("%d\n", count); 
   
   return 0;
}
2024/7/22 20:20
加载中...